我试图练习使用apply()系列中的函数。我想制作一个基于索引返回加权平均值的函数。在这种情况下,向量为“ k”。这是我的示例数据:
#gen data
i=c(1,2,3,4)
j=c(1,2,1,2)
k=c(1,2,3,1)
t=c(1,1,1,1)
w=c(5,10,15,20)
d=c(4,5,10,2)
df<- data.frame(i,j,k,t,w,d)
#weighted mean
w=df[,"w"]
y=df[,"d"]
index=df[,"k"]
接下来,我对向量p和s的尺寸有疑问。
p <- w*y
s <- array(tapply(w,index,FUN=sum))
dim(p) = 4
dim(s) = 3
我想基于索引向量k = c(1,2,3,1)重复s [1] = 25的值,以便s [4] = 25!
最终目标是能够计算:
r <- p/s
答案 0 :(得分:0)
使用weighted mean
的{{1}}的单行解决方案
data.table
基于您的方法的解决方案-
您可以使用> library(data.table)
> setDT(df)[, weighted.mean(d, w), by=k]
k V1
1: 1 2.4
2: 2 5.0
3: 3 10.0
软件包来做到这一点-
data.table
输入数据-
p <- setDT(df)[,w*d,by=.(k)][,lapply(.SD, sum),by=k][,V1]
s <- array(tapply(w,index,FUN=sum))
r <- p/s
[1] 2.4 5.0 10.0
注意-您需要先将i=c(1,2,3,4)
j=c(1,2,1,2)
k=c(1,2,3,1)
t=c(1,1,1,1)
w=c(5,10,15,20)
d=c(4,5,10,2)
df<- data.frame(i,j,k,t,w,d)
折叠成sum
,然后再除以index