我有以下数据表:
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])
但我真的希望有更好的方式
答案 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
: