R 在data.table结果中包括不用于计算的列
我有以下数据表:R 在data.table结果中包括不用于计算的列,r,data.table,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 我执行了一个Lappy group by id计算: my_data[,lapply(.SD,mean)*.SD,by=id,.SDcols=3:5] 结果如下: id V1 V2
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
我执行了一个Lappy group by id计算:
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])
但我真的希望有更好的方法来完成作业
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]
我建议你通过考试。data.table vignette的介绍解释了一个重要的观点,我将在这里重复 只要
j
返回一个列表,列表中的每个元素都将成为结果data.table中的一列
在base 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]
我现在使用的是具有某些新功能的,例如,在
中使用V1:V4
。SDcols
:确实有效谢谢!但是我想让选项1不更改原始数据集,选项2只添加一些列,而不是全部列them@George91当您正在寻找一种有效的方法时,您可能可以复制数据,即my_data1,因此据我所知,这将在v1.9.7中起作用?因为我尝试了我的_数据[,c(list(user=user),lapply(.SD,function(x)x*mean(x))),by=id,.SDcols=3:6],我得到了一个错误“object user not found”。抱歉,如果我理解错了,你是对的。当提供.SDcols
时,以前无法提供其他变量。。这是最近在v1.9.7中修复的。它很快就会以v1.9.8(奇数=devel,偶数=稳定)的形式出现在CRAN上。。但与devel合作应该没问题。有关安装说明,请参阅主页。