Решение на одну линию для weighted mean
с использованием 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
перед делениемэто с s