给定一个包含各种类型列的(预先存在的)数据框,将其所有字符列转换为因子而不影响任何其他类型列的最简单方法是什么?
这是一个示例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)
有没有办法让这个过程更加自动化?
最佳答案
罗兰的答案对于这个特定问题来说非常好,但我想我会分享一个更通用的方法。
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 足够聪明,可以用结果替换原始列。
这样做的方便之处在于,如果您想采用其他方式或进行其他转换,只需在左侧更改您要查找的内容并在右侧指定您想要将其更改为的内容即可。
关于r - 将所有数据框字符列转换为因子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20637360/