【问题标题】:convert data frame column to factor [duplicate]将数据框列转换为因子[重复]
【发布时间】:2015-10-26 13:47:34
【问题描述】:

我只想将数据框的两列转换为因子。 我使用 apply 函数,但结果是字符,而不是因子。 知道我做错了什么吗?

aa <- c(1,2,3,4)
bb <- c(6,7,8,9)
xx <- data.frame(aa, bb)
xx

yy <- apply(xx, 2, function(xx) as.factor(xx))
#      aa  bb 
# [1,] "1" "6"
# [2,] "2" "7"
# [3,] "3" "8"
# [4,] "4" "9"

当我对独立向量实施相同的操作时,它可以工作:

nn <- c(1,2,3,4)
mm <- as.factor(nn)
mm

【问题讨论】:

  • apply 正在返回一个矩阵,它要求所有元素都是相同的类型。尝试使用as.data.frame(lapply(xx, factor))
  • 是的,它有效。请把它作为一个答案。这不是很明显必须通过列表来完成。
  • @akrun 重新打开这个骗子只是幼稚的行为。我无法关闭 SO 上的所有欺骗。如果可以,欢迎您这样做。

标签: r apply lapply


【解决方案1】:

apply 通常不适合 data.frames,因为它返回一个矩阵。你可以改用lapply

yy <- data.frame(lapply(xx, as.factor))
str(yy)
#'data.frame':  4 obs. of  2 variables:
# $ aa: Factor w/ 4 levels "1","2","3","4": 1 2 3 4
# $ bb: Factor w/ 4 levels "6","7","8","9": 1 2 3 4

我假设你意识到你也可以这样做

xx <- data.frame(aa = as.factor(aa), bb = as.factor(bb))

【讨论】:

  • xx[] &lt;- lapply(xx, factor) 将更适合您的第二个选项。
【解决方案2】:

我会这样做:

library(dplyr)
yy = xx %>% mutate_each(funs(as.factor))

这会将as.factor 应用于xx 中的每一列。

【讨论】:

  • 您也可以使用magrittr 包执行xx %&lt;&gt;% mutate_each(funs(as.factor)) 以更新xx 而无需创建yy
【解决方案3】:

或者你可以这样做

library(data.table)
setDT(xx)[, lapply(.SD, as.factor)]

【讨论】:

  • 可能for (j in names(xx)) set(xx, j = j, value = factor(xx[[j]]))会更好。
  • @DavidArenburg 是的,它会是,但对于 2 列,lapply 更具可读性。
猜你喜欢
  • 2011-09-29
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 2019-04-16
  • 2016-11-03
  • 2019-12-01
相关资源
最近更新 更多