根据索引向量重复向量的值

时间:2019-04-12 18:52:34

标签: r

我试图练习使用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

1 个答案:

答案 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