2013-08-30 47 views
11

当试图将多列数据表转换为因子列时,我遇到了意想不到的问题。将多个data.table列转换为R中的因子

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是我试图转换为因子的行集合。有没有解决方法或解决方法?

+3

+1我添加了:[当with = FALSE,但j是错误的因素时,优雅地捕捉j上的内部abs()错误](https://r-forge.r-project.org/tracker/index.php ?func = detail&aid = 4867&group_id = 240&atid = 978) –

回答

23

我找到了一个解决方案:

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] 

不过,早前提到的行为似乎马车。

+0

你试图用一个因子对data.table进行索引 - 因素既不是字符也不是数字(它们是没有明显大小的分类值),所以data.table会产生错误。 – thelatemail

+1

另外,'tst [,as.factor(a)]'只是返回'as.factor(tst $ a)'而根本不索引data.table。试试'tst [,1:5]'看看我的意思。 – thelatemail

+1

如果你只有一列或者做了你所展示的东西,或者在每一列的for循环中使用'set',你可以尝试'tst [,a:= as.factor(a)]'。 – Arun

2

这现在固定在v1.8.11,但可能不像你希望的那样。来自NEWS

FR#4867现已实施。 DT[, as.factor('x'), with=FALSE]其中xDT中的一列,现在相当于DT[, "x", with=FALSE],而不是以错误结束。由于tresbot这么汇报:Converting multiple data.table columns to factors 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.frame S上的情况:

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应用什么因素是该列的元素,但只是列名...我希望我能够很好地传达差异。如果有任何混淆,请随时编辑/评论。