我有一个data.table如下所示。我试图计算数据子集的加权平均值。我已尝试过两种方法,MWE低于
set.seed(12345)
dt = data.table(a =c(10,20,25,10,10),b=rnorm(5),c=rnorm(5),d=rnorm(5),e=rnorm(5))
dt$key = sample(toupper(letters[1:3]),5,replace=T)
setkey(dt, key)
首先对.SD进行子集化并使用lapply调用,该调用不起作用(并且实际上并未预期)
dt[,lapply(.SD,function(x) weighted.mean(x,.SD[1])),by=key]
第二次尝试定义一个应用于.SD的函数,就像我使用ddply一样。
这也失败了。
wmn=function(x){
tmp = NULL
for(i in 2:ncol(x)){
tmp1 = weighted.mean(x[,i],x[,1])
tmp = c(tmp,tmp1)
}
return(tmp)
}
dt[,wmn,by=key]
关于如何最好地做到这一点的任何想法?
由于
修改
更改为所选列上wmn公式的错误。
第二次编辑
加权平均公式反转并添加了set.seed
答案 0 :(得分:11)
如果你想采用“b”的加权方式...“e”使用“a”作为权重,我认为这样做的诀窍:
dt[,lapply(.SD,weighted.mean,w=a),by=key,.SDcols=letters[1:5]]