IT story

데이터 프레임 열을 숫자 유형으로 변환하는 방법은 무엇입니까?

hot-time 2020. 4. 8. 08:00
반응형

데이터 프레임 열을 숫자 유형으로 변환하는 방법은 무엇입니까?


데이터 프레임 열을 숫자 유형으로 어떻게 변환합니까?


(아직도) 아무도 체크 표시를 얻지 못했기 때문에 변환하려는 벡터 유형을 지정하지 않았기 때문에 실제로 문제가 있다고 가정합니다 numeric. transform작업을 완료 하려면 기능을 적용해야합니다 .

이제 특정 "변환 이상"을 설명하려고합니다.

# create dummy data.frame
d <- data.frame(char = letters[1:5], 
                fake_char = as.character(1:5), 
                fac = factor(1:5), 
                char_fac = factor(letters[1:5]), 
                num = 1:5, stringsAsFactors = FALSE)

우리가 한 눈에 보자 data.frame

> d
  char fake_char fac char_fac num
1    a         1   1        a   1
2    b         2   2        b   2
3    c         3   3        c   3
4    d         4   4        d   4
5    e         5   5        e   5

우리가 실행하자 :

> sapply(d, mode)
       char   fake_char         fac    char_fac         num 
"character" "character"   "numeric"   "numeric"   "numeric" 
> sapply(d, class)
       char   fake_char         fac    char_fac         num 
"character" "character"    "factor"    "factor"   "integer" 

지금 당신은 아마 "변칙은 어디에 있습니까?" 글쎄, 난 R 꽤 독특한 것들에 충돌했습니다, 이것은 아니다 가장 혼란 함을 주죠 것은, 그러나 당신이 침대로 굴러 전에 반드시 숙지 특히, 당신을 혼란스럽게 할 수 있습니다.

처음 두 열은 character입니다. 나는 의도적으로 2nd one 이라고 불렀습니다 fake_char. characterDirk이 자신의 회신에서 작성한 변수 와이 변수 의 유사성을 발견하십시오 . 실제로로 numerical변환 벡터 character입니다. 3 번째 와 4 번째 열은 factor마지막 은 "순수하게" numeric입니다.

당신이 사용하는 경우 transform기능을, 당신은 변환 할 수 있습니다 fake_charnumeric아닌 char변수 자체를.

> transform(d, char = as.numeric(char))
  char fake_char fac char_fac num
1   NA         1   1        a   1
2   NA         2   2        b   2
3   NA         3   3        c   3
4   NA         4   4        d   4
5   NA         5   5        e   5
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion

그러나 fake_charand char_fac에서 동일한 작업을 수행 하면 운이 좋으며 NA가 없어도 도망 칠 수 있습니다.

> transform(d, fake_char = as.numeric(fake_char), 
               char_fac = as.numeric(char_fac))

  char fake_char fac char_fac num
1    a         1   1        1   1
2    b         2   2        2   2
3    c         3   3        3   3
4    d         4   4        4   4
5    e         5   5        5   5

당신이 변환 저장하는 경우 data.frame및 확인 mode하고 class, 당신은 얻을 것이다 :

> D <- transform(d, fake_char = as.numeric(fake_char), 
                    char_fac = as.numeric(char_fac))

> sapply(D, mode)
       char   fake_char         fac    char_fac         num 
"character"   "numeric"   "numeric"   "numeric"   "numeric" 
> sapply(D, class)
       char   fake_char         fac    char_fac         num 
"character"   "numeric"    "factor"   "numeric"   "integer"

결론은 다음과 같습니다. 예, character벡터를 numeric하나로 변환 할 수 있지만 요소가 "변환 가능"인 경우에만 가능합니다 numeric. character벡터에 요소가 하나만 있으면 해당 벡터를 numerical하나로 변환하려고하면 오류가 발생 합니다.

그리고 내 요점을 증명하기 위해 :

> err <- c(1, "b", 3, 4, "e")
> mode(err)
[1] "character"
> class(err)
[1] "character"
> char <- as.numeric(err)
Warning message:
NAs introduced by coercion 
> char
[1]  1 NA  3  4 NA

그리고 이제 재미 나 연습을 위해 다음 명령의 출력을 추측하십시오.

> fac <- as.factor(err)
> fac
???
> num <- as.numeric(fac)
> num
???

패트릭 번즈에게 친절하다! =)


나에게 도움이 된 것 : 변환 할 변수 범위가 있거나 (또는 ​​하나 이상인 경우)을 사용할 수 있습니다 sapply.

무의미하지만 예를 들면 다음과 같습니다.

data(cars)
cars[, 1:2] <- sapply(cars[, 1:2], as.factor)

데이터 프레임의 3, 6-15 및 37 열을 숫자로 변환해야한다고 가정 해보십시오.

dat[, c(3,6:15,37)] <- sapply(dat[, c(3,6:15,37)], as.numeric)

경우는 xdataframe의 열 이름 datx유형 인자 사용이다 :

as.numeric(as.character(dat$x))

의견을 추가했을 것입니다 (낮은 평가 할 수 없습니다)

user276042와 pangratz에 추가하기 만하면됩니다.

dat$x = as.numeric(as.character(dat$x))

기존 열 x의 값을 무시합니다.


Tim은 정확하고 Shane은 누락되었습니다. 추가 예는 다음과 같습니다.

R> df <- data.frame(a = as.character(10:15))
R> df <- data.frame(df, num = as.numeric(df$a), 
                        numchr = as.numeric(as.character(df$a)))
R> df
   a num numchr
1 10   1     10
2 11   2     11
3 12   3     12
4 13   4     13
5 14   5     14
6 15   6     15
R> summary(df)
  a          num           numchr    
 10:1   Min.   :1.00   Min.   :10.0  
 11:1   1st Qu.:2.25   1st Qu.:11.2  
 12:1   Median :3.50   Median :12.5  
 13:1   Mean   :3.50   Mean   :12.5  
 14:1   3rd Qu.:4.75   3rd Qu.:13.8  
 15:1   Max.   :6.00   Max.   :15.0  
R> 

우리는 data.frame이제 요소 열 (계산)과의 숫자 요약 요약이 as.numeric()있다 --- 잘못 이 숫자 요인 수준을 가지고로 ---과의 (올바른) 요약 as.numeric(as.character()).


다음 코드를 사용하면 모든 데이터 프레임 열을 숫자로 변환 할 수 있습니다 (X는 열을 변환하려는 데이터 프레임 임).

as.data.frame(lapply(X, as.numeric))

전체 행렬을 숫자로 변환하려면 두 가지 방법이 있습니다.

mode(X) <- "numeric"

또는:

X <- apply(X, 2, as.numeric)

또는 data.matrix함수를 사용 하여 모든 것을 숫자로 변환 할 수 있지만, 요인이 올바르게 변환되지 않을 수 있으므로 모든 것을 character먼저 변환하는 것이 더 안전합니다 .

X <- sapply(X, as.character)
X <- data.matrix(X)

나는 일반적으로 사용하는 마지막 하나를 내가 원하는 경우 동시에 매트릭스 및 숫자로 변환


귀하의 질문은 엄격하게 숫자이지만 R을 시작할 때 이해하기 어려운 많은 변환이 있습니다. 도움이되는 방법을 다루는 것을 목표로합니다. 이 질문은 유사하다 이 질문 .

(1) 요소를 숫자로 직접 변환 할 수없고, 먼저 문자 클래스로 변환해야하며, (2) 날짜는 일반적으로 별도로 처리해야하는 특수한 경우이므로 유형 변환은 R에서 고통이 될 수 있습니다. (3) 데이터 프레임 열을 반복하는 것은 까다로울 수 있습니다. 다행히 "tidyverse"는 대부분의 문제를 해결했습니다.

이 솔루션은 mutate_each()데이터 프레임의 모든 열에 함수를 적용하는 데 사용 됩니다. 이 경우 type.convert()함수 를 적용하여 문자열을 가능한 숫자로 변환합니다. R은 문자를 유지 해야하는 문자 열을 인수로 변경하기 때문에 이유를 잘 모릅니다. 이 문제를 해결하기 위해이 mutate_if()함수는 요인 인 열을 감지하고 문자로 변경하는 데 사용됩니다. 마지막으로, 윤활유를 사용하여 문자 클래스의 타임 스탬프를 날짜-시간으로 변경하는 방법을 보여 드리고 싶었습니다. 초보자에게도 자주 사용되는 블록이기 때문입니다.


library(tidyverse) 
library(lubridate)

# Recreate data that needs converted to numeric, date-time, etc
data_df
#> # A tibble: 5 × 9
#>             TIMESTAMP SYMBOL    EX  PRICE  SIZE  COND   BID BIDSIZ   OFR
#>                 <chr>  <chr> <chr>  <chr> <chr> <chr> <chr>  <chr> <chr>
#> 1 2012-05-04 09:30:00    BAC     T 7.8900 38538     F  7.89    523  7.90
#> 2 2012-05-04 09:30:01    BAC     Z 7.8850   288     @  7.88  61033  7.90
#> 3 2012-05-04 09:30:03    BAC     X 7.8900  1000     @  7.88   1974  7.89
#> 4 2012-05-04 09:30:07    BAC     T 7.8900 19052     F  7.88   1058  7.89
#> 5 2012-05-04 09:30:08    BAC     Y 7.8900 85053     F  7.88 108101  7.90

# Converting columns to numeric using "tidyverse"
data_df %>%
    mutate_all(type.convert) %>%
    mutate_if(is.factor, as.character) %>%
    mutate(TIMESTAMP = as_datetime(TIMESTAMP, tz = Sys.timezone()))
#> # A tibble: 5 × 9
#>             TIMESTAMP SYMBOL    EX PRICE  SIZE  COND   BID BIDSIZ   OFR
#>                <dttm>  <chr> <chr> <dbl> <int> <chr> <dbl>  <int> <dbl>
#> 1 2012-05-04 09:30:00    BAC     T 7.890 38538     F  7.89    523  7.90
#> 2 2012-05-04 09:30:01    BAC     Z 7.885   288     @  7.88  61033  7.90
#> 3 2012-05-04 09:30:03    BAC     X 7.890  1000     @  7.88   1974  7.89
#> 4 2012-05-04 09:30:07    BAC     T 7.890 19052     F  7.88   1058  7.89
#> 5 2012-05-04 09:30:08    BAC     Y 7.890 85053     F  7.88 108101  7.90

문제가 발생하면 :

as.numeric(as.character(dat$x))

소수점을 살펴보십시오. "."대신 ","인 경우 (예 : "5,3") 위 기능이 작동하지 않습니다.

가능한 해결책은 다음과 같습니다.

as.numeric(gsub(",", ".", dat$x))

영어권이 아닌 일부 국가에서는 이것이 일반적이라고 생각합니다.


보편적 인 방법 사용 type.convert()rapply():

convert_types <- function(x) {
    stopifnot(is.list(x))
    x[] <- rapply(x, utils::type.convert, classes = "character",
                  how = "replace", as.is = TRUE)
    return(x)
}
d <- data.frame(char = letters[1:5], 
                fake_char = as.character(1:5), 
                fac = factor(1:5), 
                char_fac = factor(letters[1:5]), 
                num = 1:5, stringsAsFactors = FALSE)
sapply(d, class)
#>        char   fake_char         fac    char_fac         num 
#> "character" "character"    "factor"    "factor"   "integer"
sapply(convert_types(d), class)
#>        char   fake_char         fac    char_fac         num 
#> "character"   "integer"    "factor"    "factor"   "integer"

데이터 프레임 열을 숫자로 변환하려면 다음을 수행해야합니다.

숫자로 계수 :-

data_frame$column <- as.numeric(as.character(data_frame$column))

다른 사람들이 주제를 잘 다루었지만이 빠른 생각 / 힌트를 추가하고 싶습니다. regexp를 사용하여 문자가 숫자로만 구성 될 수 있는지 미리 확인할 수 있습니다.

for(i in seq_along(names(df)){
     potential_numcol[i] <- all(!grepl("[a-zA-Z]",d[,i]))
}
# and now just convert only the numeric ones
d <- sapply(d[,potential_numcol],as.numeric)

보다 복잡한 정규식과 그들의 힘을 배우고 경험해야하는 깔끔한 이유는 다음의 멋진 웹 사이트를 참조하십시오 : http://regexr.com/


내 PC (R의 v.3.2.3)에서, apply또는 sapply주고 오류가 발생했습니다. lapply잘 작동합니다.

dt[,2:4] <- lapply(dt[,2:4], function (x) as.factor(as.numeric(x)))

데이터 프레임에 여러 유형의 열, 일부 문자가있는 경우 일부 숫자는 다음을 시도하여 숫자 값이 포함 된 열만 숫자로 변환합니다.

for (i in 1:length(data[1,])){
  if(length(as.numeric(data[,i][!is.na(data[,i])])[!is.na(as.numeric(data[,i][!is.na(data[,i])]))])==0){}
  else {
    data[,i]<-as.numeric(data[,i])
  }
}

hablar :: 변환

여러 열을 다른 데이터 형식으로 쉽게 변환하기 위해 사용할 수 있습니다 hablar::convert. 간단한 구문 : df %>% convert(num(a))열 a를 df에서 숫자로 변환합니다.

자세한 예

모든 열 mtcars을 문자 로 변환 할 수 있습니다 .

df <- mtcars %>% mutate_all(as.character) %>% as_tibble()

> df
# A tibble: 32 x 11
   mpg   cyl   disp  hp    drat  wt    qsec  vs    am    gear  carb 
   <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
 1 21    6     160   110   3.9   2.62  16.46 0     1     4     4    
 2 21    6     160   110   3.9   2.875 17.02 0     1     4     4    
 3 22.8  4     108   93    3.85  2.32  18.61 1     1     4     1    

hablar::convert:

library(hablar)

# Convert columns to integer, numeric and factor
df %>% 
  convert(int(cyl, vs),
          num(disp:wt),
          fct(gear))

결과 :

# A tibble: 32 x 11
   mpg     cyl  disp    hp  drat    wt qsec     vs am    gear  carb 
   <chr> <int> <dbl> <dbl> <dbl> <dbl> <chr> <int> <chr> <fct> <chr>
 1 21        6  160    110  3.9   2.62 16.46     0 1     4     4    
 2 21        6  160    110  3.9   2.88 17.02     0 1     4     4    
 3 22.8      4  108     93  3.85  2.32 18.61     1 1     4     1    
 4 21.4      6  258    110  3.08  3.22 19.44     1 0     3     1   

char 열이있을 수 있다고 생각하면 Excel 시트의 열 유형 가져 오기가 자동으로 응답 하는 @Abdou을 기반 으로합니다 .

makenumcols<-function(df){
  df<-as.data.frame(df)
  df[] <- lapply(df, as.character)
  cond <- apply(df, 2, function(x) {
    x <- x[!is.na(x)]
    all(suppressWarnings(!is.na(as.numeric(x))))
  })
  numeric_cols <- names(df)[cond]
  df[,numeric_cols] <- sapply(df[,numeric_cols], as.numeric)
  return(df)
}
df<-makenumcols(df)

문자를 숫자로 변환하려면 적용하여 문자를 인수로 변환해야합니다

BankFinal1 <- transform(BankLoan,   LoanApproval=as.factor(LoanApproval))
BankFinal1 <- transform(BankFinal1, LoanApp=as.factor(LoanApproval))

하나의 열은 숫자로 변환 할 수 없으므로 동일한 데이터로 두 개의 열을 만들어야합니다. 하나의 변환을 수행하면 아래 오류가 발생합니다.

transform(BankData, LoanApp=as.numeric(LoanApproval))
Warning message:
  In eval(substitute(list(...)), `_data`, parent.frame()) :
  NAs introduced by coercion

따라서 동일한 데이터의 두 열을 수행 한 후

BankFinal1 <- transform(BankFinal1, LoanApp      = as.numeric(LoanApp), 
                                    LoanApproval = as.numeric(LoanApproval))

문자를 숫자로 변환합니다

참고 URL : https://stackoverflow.com/questions/2288485/how-to-convert-a-data-frame-column-to-numeric-type

반응형