在data.table结果

时间:2016-06-10 09:32:31

标签: r data.table

我有以下数据表:

   id user V1 V2 V3 V4
1:  1    1  1  1  1  0
2:  1    2  4  1  3  1
3:  1    3  0  1  6  0
4:  2    1  1  0  2  1
5:  2    2  2  1  0  0

我通过id计算执行一个lapply组:

my_data[,lapply(.SD,mean)*.SD,by=id,.SDcols=3:5] 

结果如下:

    id    V1    V2      V3
1:  1 1.666667 1.0  3.333333
2:  1 6.666667 1.0 10.000000
3:  1 0.000000 1.0 20.000000
4:  2 1.500000 0.0  2.000000
5:  2 3.000000 0.5  0.000000

是否有简单的数据表方式来包含原始数据表中的列用户? 我设法用

做到了
cbind(my_data[,.(user)], my_data[,lapply(.SD,mean)*.SD,by=id,.SDcols=3:5])

但我真的希望有更好的方式

2 个答案:

答案 0 :(得分:3)

我们可以进行作业

my_data[,(3:5) := lapply(.SD,mean)*.SD,by=id,.SDcols=3:5] 

或者不是乘以.SD,而是在循环本身内进行。

my_data[, (3:5) := lapply(.SD, function(x) mean(x)*x), .SDcols = 3:5, by = id]

答案 1 :(得分:3)

我建议你浏览vignettes data.table 简介简介解释了一个重要的观点,我将在此重复。

  

只要j返回列表,列表中的每个元素都将成为生成的 data.table 中的一列。

在基数R中,c(list, list)返回包含所有元素的新列表。我们可以简单地使用现有功能:

require(data.table) # v1.9.7 devel
dt[, c(list(user=user), lapply(.SD, function(x) x*mean(x))), by=id, .SDcols=V1:V4]

我在current development version of data.table, v1.9.7上有一些新功能,例如在V1:V4中使用.SDcols

相关问题