답변:
(아직도) 아무도 체크 표시를 얻지 못했기 때문에 변환하려는 벡터 유형을 지정하지 않았기 때문에 실제로 문제가 있다고 가정합니다 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)
sapply
에 호출 as.data.frame()
오른쪽에를 @Mehrad Mahmoudian 아래 제안, 그것은 작동합니다.
경우는 x
dataframe의 열 이름 dat
및 x
유형 인자 사용이다 :
as.numeric(as.character(dat$x))
as.character
실제로 추가하는 것은 내가 찾던 것입니다. 그렇지 않으면 변환이 잘못되는 경우가 있습니다. 적어도 내 경우에는.
Error: (list) object cannot be coerced to type 'double'
벡터에 문자 / 문장 부호가 없음을 합리적으로 확신했습니다. 그런 다음 시도 as.numeric(as.character(dat$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
mutate_all(type.convert, as.is=TRUE)
대신에 를 사용 하면 명령을 단축하기 mutate_all(type.convert)
위해 제거 / 피할 수 있습니다 mutate_if(is.factor, as.character)
. 문자열을 문자 또는 요소로 변환해야하는지 여부를 나타내는 as.is
인수입니다 type.convert()
. 기본적으로 as.is=FALSE
in에서 type.convert()
(즉, 문자열을 문자 클래스 대신 요인 클래스로 변환)
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)
나는 일반적으로 사용하는 마지막 하나를 내가 원하는 경우 동시에 매트릭스 및 숫자로 변환
type.convert()
and를 사용하는 보편적 인 방법 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"
as.is = TRUE
문자를 숫자 나 요소로 변환하려면 제거하십시오
matrix
숫자 변화를 classes=matrix
첫 번째 인수를 오류가 발생한 것은 모드 문자이어야합니다
데이터 프레임 열을 숫자로 변환하려면 다음을 수행해야합니다.
숫자로 계수 :-
data_frame$column <- as.numeric(as.character(data_frame$column))
sapply(data_frame,function(x) as.numeric(as.character(x)))
다른 사람들이 주제를 잘 다루었지만이 빠른 생각 / 힌트를 추가하고 싶습니다. 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/
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)
와 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
문자를 숫자로 변환하려면 적용하여 인수로 변환해야합니다
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))
문자를 숫자로 변환합니다