在data.table中混合使用和.SDcols

时间:2016-10-18 14:59:30

标签: r data.table

我正在尝试在by .SDcols中混合使用data.tablecran 1.9.6(并且还在github上对dev进行了测试,因此我可能会误入歧途)< / p>

f = function(x){                                   
    print(x);                                      
    res=data.table(X=x,Y=x*x);                     
    return(res)                                    
}                                                  
DT = data.table(x=1:4, y=rep(c('a','b'),2))        
DT[,c('A','B'):=lapply(.SD,FUN=f),.SDcols='x',by=y]

我明白了:

[1] 1 3
Error in `[.data.table`(DT, , `:=`(c("A", "B"), lapply(.SD, FUN = f)),  : 
  All items in j=list(...) should be atomic vectors or lists. If you are trying something like j=list(.SD,newcol=mean(colA)) then use := by group instead (much quicker), or cbind or merge afterwards.

我希望

   x y A B
1: 1 a 1 1
2: 2 b 2 4
3: 3 a 3 9
4: 4 b 4 16

我原本希望通过操作进行操作,并且SDcols可以替换为&#39; x&#39;有人可以解释为什么我错了吗?

1 个答案:

答案 0 :(得分:2)

正如@Frank所指出的那样,以下所有工作都解决了问题在于lapply列表的层次嵌套

DT[,f(.SD[[1]]),.SDcols='x',by=y]
   y X  Y
1: a 1  1
2: a 3  9
3: b 2  4
4: b 4 16

DT[,lapply(.SD, f)[[1]],.SDcols='x',by=y]
   y X  Y
1: a 1  1
2: a 3  9
3: b 2  4
4: b 4 16

DT[,rbindlist(lapply(.SD, f)),.SDcols='x',by=y]
   y X  Y
1: a 1  1
2: a 3  9
3: b 2  4
4: b 4 16

DT[,sapply(.SD, f),.SDcols='x',by=y]

   y V1 V2
1: a  1  1
2: a  3  9
3: b  2  4
4: b  4 16

DT[,mapply(FUN=f, mget('x')),by=y]
   y V1 V2
1: a  1  1
2: a  3  9
3: b  2  4
4: b  4 16