모든 데이터 프레임 문자 열을 인자로 변환
다양한 유형의 열이 있는 (기존) 데이터 프레임을 고려할 때, 다른 유형의 열에 영향을 주지 않고 모든 문자 열을 인자로 변환하는 가장 간단한 방법은 무엇입니까?
여기 예가 있어요.data.frame
:
df <- data.frame(A = factor(LETTERS[1:5]),
B = 1:5, C = as.logical(c(1, 1, 0, 0, 1)),
D = letters[1:5],
E = paste(LETTERS[1:5], letters[1:5]),
stringsAsFactors = FALSE)
df
# A B C D E
# 1 A 1 TRUE a A a
# 2 B 2 TRUE b B b
# 3 C 3 FALSE c C c
# 4 D 4 FALSE d D d
# 5 E 5 TRUE e E e
str(df)
# 'data.frame': 5 obs. of 5 variables:
# $ A: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
# $ B: int 1 2 3 4 5
# $ C: logi TRUE TRUE FALSE FALSE TRUE
# $ D: chr "a" "b" "c" "d" ...
# $ E: chr "A a" "B b" "C c" "D d" ...
제가 할 수 있는 일은:
df$D <- as.factor(df$D)
df$E <- as.factor(df$E)
이 프로세스를 좀 더 자동화할 수 있는 방법이 있습니까?
이 구체적인 문제에 대해서는 Roland의 대답도 좋지만, 좀 더 일반화된 접근법을 공유할 것으로 생각했습니다.
DF <- data.frame(x = letters[1:5], y = 1:5, z = LETTERS[1:5],
stringsAsFactors=FALSE)
str(DF)
# 'data.frame': 5 obs. of 3 variables:
# $ x: chr "a" "b" "c" "d" ...
# $ y: int 1 2 3 4 5
# $ z: chr "A" "B" "C" "D" ...
## The conversion
DF[sapply(DF, is.character)] <- lapply(DF[sapply(DF, is.character)],
as.factor)
str(DF)
# 'data.frame': 5 obs. of 3 variables:
# $ x: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
# $ y: int 1 2 3 4 5
# $ z: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
변환의 경우, 할당의 왼쪽(DF[sapply(DF, is.character)]
) 문자인 열을 부분 집합화합니다.오른쪽에서, 그 부분집합에 대해, 당신은lapply
필요한 모든 변환을 수행할 수 있습니다.R은 원래 열을 결과로 대체할 수 있을 정도로 똑똑합니다.
이와 관련하여 편리한 점은 다른 방향으로 이동하거나 다른 변환을 수행하고자 하는 경우 왼쪽에서 원하는 내용을 변경하고 오른쪽에서 원하는 내용을 지정하는 것처럼 간단하다는 것입니다.
DF <- data.frame(x=letters[1:5], y=1:5, stringsAsFactors=FALSE)
str(DF)
#'data.frame': 5 obs. of 2 variables:
# $ x: chr "a" "b" "c" "d" ...
# $ y: int 1 2 3 4 5
사용가능as.data.frame
모든 문자 열을 요인 열로 변환하는 방법:
DF <- as.data.frame(unclass(DF),stringsAsFactors=TRUE)
str(DF)
#'data.frame': 5 obs. of 2 variables:
# $ x: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
# $ y: int 1 2 3 4 5
@Raf Z가 이 질문에 대해 언급했듯이, dplyr는 이제 mutate_if를 가지게 되었습니다.매우 유용하고 간단하며 읽기 쉽습니다.
> str(df)
'data.frame': 5 obs. of 5 variables:
$ A: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
$ B: int 1 2 3 4 5
$ C: logi TRUE TRUE FALSE FALSE TRUE
$ D: chr "a" "b" "c" "d" ...
$ E: chr "A a" "B b" "C c" "D d" ...
> df <- df %>% mutate_if(is.character,as.factor)
> str(df)
'data.frame': 5 obs. of 5 variables:
$ A: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
$ B: int 1 2 3 4 5
$ C: logi TRUE TRUE FALSE FALSE TRUE
$ D: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
$ E: Factor w/ 5 levels "A a","B b","C c",..: 1 2 3 4 5
함께 작업dplyr
library(dplyr)
df <- data.frame(A = factor(LETTERS[1:5]),
B = 1:5, C = as.logical(c(1, 1, 0, 0, 1)),
D = letters[1:5],
E = paste(LETTERS[1:5], letters[1:5]),
stringsAsFactors = FALSE)
str(df)
다음을 얻을 수 있습니다.
'data.frame': 5 obs. of 5 variables:
$ A: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
$ B: int 1 2 3 4 5
$ C: logi TRUE TRUE FALSE FALSE TRUE
$ D: chr "a" "b" "c" "d" ...
$ E: chr "A a" "B b" "C c" "D d" ...
이제 우리는 모든 것을 전환할 수 있습니다.chr
로.factors
:
df <- df%>%mutate_if(is.character, as.factor)
str(df)
다음과 같은 결과를 얻을 수 있습니다.
'data.frame': 5 obs. of 5 variables:
$ A: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
$ B: int 1 2 3 4 5
$ C: logi TRUE TRUE FALSE FALSE TRUE
$ D: chr "a" "b" "c" "d" ...
$ E: chr "A a" "B b" "C c" "D d" ...
다음과 같은 다른 솔루션도 제공합니다.
기본 패키지 포함:
df[sapply(df, is.character)] <- lapply(df[sapply(df, is.character)],
as.factor)
와 함께dplyr
1.0.0
df <- df%>%mutate(across(where(is.factor), as.character))
와 함께purrr
패키지:
library(purrr)
df <- df%>% modify_if(is.factor, as.character)
가장 쉬운 방법은 아래에 제시된 코드를 사용하는 것입니다.R의 데이터 프레임에서 모든 변수를 인자로 변환하는 모든 과정을 자동화합니다. 저에게는 완벽하게 잘 작동했습니다. 여기 제가 사용하고 있는 데이터 세트가 food_cat입니다.현재 작업 중인 것으로 변경합니다.
for(i in 1:ncol(food_cat)){
food_cat[,i] <- as.factor(food_cat[,i])
}
전에 간단한 일을 했습니다.for
루프. @A5C1D2H2I1M1N2O1R2T1 답변과 같이,lapply
좋은 해결책입니다.하지만 당신이 모든 열을 변환한다면, 당신은 당신이 필요할 것입니다.data.frame
전에, 그렇지 않으면 당신은 결국 a로 끝날 것입니다.list
. 실행 시간 차이가 거의 없습니다.
mm2N=mm2New[,10:18]
str(mm2N)
'data.frame': 35487 obs. of 9 variables:
$ bb : int 4 6 2 3 3 2 5 2 1 2 ...
$ vabb : int -3 -3 -2 -2 -3 -1 0 0 3 3 ...
$ bb55 : int 7 6 3 4 4 4 9 2 5 4 ...
$ vabb55: int -3 -1 0 -1 -2 -2 -3 0 -1 3 ...
$ zr : num 0 -2 -1 1 -1 -1 -1 1 1 0 ...
$ z55r : num -2 -2 0 1 -2 -2 -2 1 -1 1 ...
$ fechar: num 0 -1 1 0 1 1 0 0 1 0 ...
$ varr : num 3 3 1 1 1 1 4 1 1 3 ...
$ minmax: int 3 0 4 6 6 6 0 6 6 1 ...
# For solution
t1=Sys.time()
for(i in 1:ncol(mm2N)) mm2N[,i]=as.factor(mm2N[,i])
Sys.time()-t1
Time difference of 0.2020121 secs
str(mm2N)
'data.frame': 35487 obs. of 9 variables:
$ bb : Factor w/ 6 levels "1","2","3","4",..: 4 6 2 3 3 2 5 2 1 2 ...
$ vabb : Factor w/ 7 levels "-3","-2","-1",..: 1 1 2 2 1 3 4 4 7 7 ...
$ bb55 : Factor w/ 8 levels "2","3","4","5",..: 6 5 2 3 3 3 8 1 4 3 ...
$ vabb55: Factor w/ 7 levels "-3","-2","-1",..: 1 3 4 3 2 2 1 4 3 7 ...
$ zr : Factor w/ 5 levels "-2","-1","0",..: 3 1 2 4 2 2 2 4 4 3 ...
$ z55r : Factor w/ 5 levels "-2","-1","0",..: 1 1 3 4 1 1 1 4 2 4 ...
$ fechar: Factor w/ 3 levels "-1","0","1": 2 1 3 2 3 3 2 2 3 2 ...
$ varr : Factor w/ 5 levels "1","2","3","4",..: 3 3 1 1 1 1 4 1 1 3 ...
$ minmax: Factor w/ 7 levels "0","1","2","3",..: 4 1 5 7 7 7 1 7 7 2 ...
#lapply solution
mm2N=mm2New[,10:18]
t1=Sys.time()
mm2N <- lapply(mm2N, as.factor)
Sys.time()-t1
Time difference of 0.209012 secs
str(mm2N)
List of 9
$ bb : Factor w/ 6 levels "1","2","3","4",..: 4 6 2 3 3 2 5 2 1 2 ...
$ vabb : Factor w/ 7 levels "-3","-2","-1",..: 1 1 2 2 1 3 4 4 7 7 ...
$ bb55 : Factor w/ 8 levels "2","3","4","5",..: 6 5 2 3 3 3 8 1 4 3 ...
$ vabb55: Factor w/ 7 levels "-3","-2","-1",..: 1 3 4 3 2 2 1 4 3 7 ...
$ zr : Factor w/ 5 levels "-2","-1","0",..: 3 1 2 4 2 2 2 4 4 3 ...
$ z55r : Factor w/ 5 levels "-2","-1","0",..: 1 1 3 4 1 1 1 4 2 4 ...
$ fechar: Factor w/ 3 levels "-1","0","1": 2 1 3 2 3 3 2 2 3 2 ...
$ varr : Factor w/ 5 levels "1","2","3","4",..: 3 3 1 1 1 1 4 1 1 3 ...
$ minmax: Factor w/ 7 levels "0","1","2","3",..: 4 1 5 7 7 7 1 7 7 2 ...
#data.frame lapply solution
mm2N=mm2New[,10:18]
t1=Sys.time()
mm2N <- data.frame(lapply(mm2N, as.factor))
Sys.time()-t1
Time difference of 0.2010119 secs
str(mm2N)
'data.frame': 35487 obs. of 9 variables:
$ bb : Factor w/ 6 levels "1","2","3","4",..: 4 6 2 3 3 2 5 2 1 2 ...
$ vabb : Factor w/ 7 levels "-3","-2","-1",..: 1 1 2 2 1 3 4 4 7 7 ...
$ bb55 : Factor w/ 8 levels "2","3","4","5",..: 6 5 2 3 3 3 8 1 4 3 ...
$ vabb55: Factor w/ 7 levels "-3","-2","-1",..: 1 3 4 3 2 2 1 4 3 7 ...
$ zr : Factor w/ 5 levels "-2","-1","0",..: 3 1 2 4 2 2 2 4 4 3 ...
$ z55r : Factor w/ 5 levels "-2","-1","0",..: 1 1 3 4 1 1 1 4 2 4 ...
$ fechar: Factor w/ 3 levels "-1","0","1": 2 1 3 2 3 3 2 2 3 2 ...
$ varr : Factor w/ 5 levels "1","2","3","4",..: 3 3 1 1 1 1 4 1 1 3 ...
$ minmax: Factor w/ 7 levels "0","1","2","3",..: 4 1 5 7 7 7 1 7 7 2 ...
반복할 때 "["" 색인 열이 레벨을 생성하지 못합니다.
( convert.to .factors의 a_feature) {
feature.df[a_feature] <- factor(feature.df[a_feature]) }
예를 들어 "Status" 열에 대해 다음을 만듭니다.
상태 : 1 수준 "c(\"성공\"), \"실패\"인 인자 w : NANA...
"["] 인덱싱을 사용하여 해결할 수 있습니다.
.factors 의 a_feature) {
<-[a_feature]) }feature.df [a_feature] <- factor(feature.df [a_feature]) }
원하는 대로 대신 제공:
. 상태 : 2단계의 요인 "성공", "실패" : 1 1 2 1...
@Rolland의 대답과 @Paul de Barros의 의견을 바탕으로 다음과 같은 결론을 내렸습니다.
df <- data.frame(A = factor(LETTERS[1:5]),
B = 1:5, C = as.logical(c(1, 1, 0, 0, 1)),
D = letters[1:5],
E = paste(LETTERS[1:5], letters[1:5]),
stringsAsFactors = FALSE)
df<-as.data.frame(unclass(df),stringsAsFactors=TRUE)
str(df)
실질적으로 그리고 단순히 효과가 있는 것처럼 보입니다.
> str(df)
'data.frame': 5 obs. of 5 variables:
$ A: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
$ B: int 1 2 3 4 5
$ C: logi TRUE TRUE FALSE FALSE TRUE
$ D: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
$ E: Factor w/ 5 levels "A a","B b","C c",..: 1 2 3 4 5
언급URL : https://stackoverflow.com/questions/20637360/convert-all-data-frame-character-columns-to-factors
'programing' 카테고리의 다른 글
Mysql: 좋아요? (0) | 2023.10.22 |
---|---|
net:: 노드-웹킷에서 ajax 요청을 하는 동안 ERR_INSECUR_RESPENCE (0) | 2023.10.22 |
문자열의 처음이나 끝에서 공백을 모두 제거하는 방법은 무엇입니까? (0) | 2023.10.22 |
'ng'는 내부 또는 외부 명령, 작동 가능한 프로그램 또는 배치 파일로 인식되지 않습니다. (0) | 2023.10.22 |
변수 ID 이름을 대상으로 하는 CSS (0) | 2023.10.22 |