我希望得到V1
加权V2
并按V3
和V4
加权,所以我尝试aggregate
,它没有&#39}。因为weighted.mean
只接受来自aggregate
的一个参数,所以它与mean
相同:
df <- data.frame(V1=seq(1, 1.5, 0.1),
V2=seq(6, 1, -1),
V3=c('A','A','A','B','B','B'),
V4=c('F','P','P','P','F','F'))
aggregate(cbind(V1, V2) ~ V3 + V4, data=df, weighted.mean)
V3 V4 V1 V2
1 A F 1.00 6.0
2 B F 1.45 1.5
3 A P 1.15 4.5
4 B P 1.30 3.0
所以我必须回到split
,lapply
并处理许多其他事情
df1 <- expand.grid(unique(df$V3), unique(df$V4))
colnames(df1) <- c('V3','V4')
df1$CrossTerm <- interaction(df1$V3, df1$V4)
temp <- sapply(split(df, interaction(df$V3, df$V4)), function(df) weighted.mean(df$V1, df$V2))
df2 <- data.frame(WeightedAvg=temp)
df2$CrossTerm <- rownames(df2)
df3 <- merge(df1, df2, by="CrossTerm")
df3$CrossTerm <- NULL
df3
V3 V4 WeightedAvg
1 A F 1.000000
2 A P 1.144444
3 B F 1.433333
4 B P 1.300000
但它是一个丑陋且可能有问题的解决方案,是否有更好的解决方案来获得类似的结果?格式很重要,应该尽可能与我的输出类似(行的顺序可以不同)。
答案 0 :(得分:2)
您可以使用data.table
聚合轻松完成此操作:
library(data.table)
setDT(df)
##
R> df[
,list(
wtdMean=weighted.mean(V1,V2)
),
keyby="V3,V4"]
V3 V4 wtdNMean
1: A F 1.000000
2: A P 1.144444
3: B F 1.433333
4: B P 1.300000