17

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

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),with=FALSE] 时发现了这一点,其中 cols 是我试图转换为因子的行的集合。有什么解决方案或解决方法吗?

4

2 回答 2

35

我找到了一种解决方案:

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]

尽管如此,前面提到的行为似乎还是有问题的。

于 2013-08-30T06:17:03.313 回答
4

这现在在v1.8.11中得到修复,但可能不是您希望的方式。来自新闻

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


一些解释:不同之处with=FALSE在于使用时的列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.frames 为例:

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!

因此,基本上,当您使用with=FALSE不是该列的元素,而是该列名称时,您应用的因素是……我希望我已经设法很好地传达了差异。如果有任何混淆,请随时编辑/评论。

于 2013-11-01T00:57:12.060 回答