r - 将所有数据框字符列转换为因子

标签 r dataframe

给定一个包含各种类型列的(预先存在的)数据框,将其所有字符列转换为因子而不影响任何其他类型列的最简单方法是什么?

这是一个示例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/

相关文章:

r - GNUEmacs/ESS/ latex /Sweave : text displays differently when cursor is in latex code or in R code

R - 优化(最大)

r - 使用 ncdf4::ncvar_get 时如何指定维度顺序?

r - 避免在带有 bs() 项的模型公式中写入大量列名

python - Pandas 每行获得前 n 列

r - 让统计学家满意 : Stata vs. R 学生 t 检验

python - 一对一比较 pandas Dataframe 列值

python - Pandas 枢轴并加入两个数据框

python - Pandas 过滤串联的多个子字符串

Python 数据框 : Remove duplicate words in the same cell within a column in Python