데이터 프레임 열을 숫자 유형으로 어떻게 변환합니까?
답변
(아직도) 아무도 체크 표시를 얻지 못했기 때문에 변환하려는 벡터 유형을 지정하지 않았기 때문에 실제로 문제가 있다고 가정합니다 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
. character
Dirk이 자신의 회신에서 작성한 변수 와이 변수 의 유사성을 발견하십시오 . 실제로로 numerical
변환 된 벡터 character
입니다. 3 번째 와 4 번째 열은 factor
마지막 열 은 “순수하게” numeric
입니다.
당신이 사용하는 경우 transform
기능을, 당신은 변환 할 수 있습니다 fake_char
에 numeric
아닌 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_char
and 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)
답변
경우는 x
dataframe의 열 이름 dat
및 x
유형 인자 사용이다 :
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)
나는 일반적으로 사용하는 마지막 하나를 내가 원하는 경우 동시에 매트릭스 및 숫자로 변환