将多个data.table列转换为R中的因子

时间:2013-08-30 05:57:25

标签: r data.table

尝试将数据表的多个列转换为因子列时遇到了意外问题。我将其转载如下:

library(data.table)
tst <- data.table('a' = c('b','b','c','c'))
class(tst[,a])
tst[,as.factor(a)]  #Returns expected result
tst[,as.factor('a'),with=FALSE] #Returns error

后一个命令返回'Math.factor(j)中的错误:abs对因子没有意义'。我试图获得tst [,lapply(cols,as.factor),= = FALSE]时发现了这一点,其中cols是我试图转换为因子的行的集合。这有什么解决方案或解决方法吗?

2 个答案:

答案 0 :(得分:26)

我找到了一个解决方案:

library(data.table)
tst <- data.table('a' = c('b','b','c','c'))
class(tst[,a])
cols <- 'a'
tst[,(cols):=lapply(.SD, as.factor),.SDcols=cols]

但是,前面提到的行为似乎有些不足。

答案 1 :(得分:2)

现在已在v1.8.11中修复此问题,但可能与您希望的方式不一致。来自NEWS

  

FR#4867现已实施。 DT[, as.factor('x'), with=FALSE]其中xDT中的列,DT[, "x", with=FALSE]现在等同于with=FALSE,而不是以错误结束。感谢tresbot报告SO:Converting multiple data.table columns to factors in R


一些解释:使用data.table时,差异在于tst[, as.factor(a), with=FALSE] # would give "a" not found! 的列不再被视为变量。那就是:

"a" not found

会导致错误tst[, as.factor('a'), with=FALSE] 。但你做的是:

"a"

您实际上正在使用level="a"创建因子data.frame,并要求将该列作为子集。这没有多大意义。以DF <- data.frame(x=1:5, y=6:10) DF[, c("x", "y")] # gives back DF DF[, factor(c("x", "y"))] # gives back DF again, not factor columns DF[, factor(c("x", "x"))] # gives back two columns of "x", still integer, not factor! s:

为例
with=FALSE

所以,基本上,当你使用{{1}}时,你正在应用一个因素的是而不是那个列的元素,而只是那个列名...我希望我设法很好地传达了这种差异。如果有任何混淆,请随时编辑/评论。