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

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



답변

(아직도) 아무도 체크 표시를 얻지 못했기 때문에 변환하려는 벡터 유형을 지정하지 않았기 때문에 실제로 문제가 있다고 가정합니다 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의 값을 무시합니다.


답변

귀하의 질문은 엄격하게 숫자이지만 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


답변

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)

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