在R中为不同权重组计算一系列加权平均数

5
我有以下数据集(我的实际数据的简化版本)'data',希望分别使用权重w1和w2计算变量x1和x2的加权平均值,并将其分成两组(组由变量n确定)。
data <- data.frame(n = c(1,1,1,2,2,2), x1 = c(4,5,4,7,5,5), x2 = c(7,10,9,NaN,11,12), w1 = c(0,1,1,1,1,1), w2 = c(1,1,1,0,0,1))

我正在尝试使用with(),但在运行以下代码时出现错误:

with(data, aggregate(x = list(x1=x1, x2=x2), by = list(n = n), FUN = weighted.mean, w = list(w1 = w1,w2 = w2)))

另一方面,如果没有指定权重,则会起作用,但在这种情况下将使用默认级别权重(即与使用FUN=mean相同)。
with(data, aggregate(x = list(x1=x1, x2=x2), by = list(n = n), FUN = weighted.mean))

这个问题与按组和列加权平均值类似,但我的问题涉及到不同列的不同加权。我尝试使用数据表,但它会遇到与with()相同的加权错误。感谢您提前的任何帮助。
2个回答

9

尝试

library(data.table)
setDT(data)[, .(x1=weighted.mean(x1, w1), x2=weighted.mean(x2, w2)) , by = n]

或者像@thelatemail评论的那样,我们可以使用Map循环遍历“x”的对应“w”的列,并使用单个weighted.mean调用。

setDT(data)[, Map(weighted.mean, list(x1,x2), list(w1,w2)), by = n]

如果有很多“x”和“w”列,我们可以使用grep获取列名,并使用mget返回Map中的值。
setDT(data)[,  Map(weighted.mean, mget(grep('x', names(data), 
    value=TRUE)), mget(grep('w', names(data), value=TRUE))), by = n]

1
为了避免多次输入函数,可以使用data[, Map(weighted.mean, list(x1,x2), list(w1,w2)), by=n] - thelatemail
@thelatemail 这是非常好的选择。我也在想在 R 基础环境中使用 Map,但做得不对。这个问题应该单独发布帖子。 - akrun
2
它本质上与您的代码相同,如果您愿意,可以随意进行编辑。我不需要虚拟互联网积分 :-) - thelatemail

4

尝试:

library(dplyr)
data %>% 
  group_by(n) %>% 
  summarise(x1 = weighted.mean(x1, w1), x2 = weighted.mean(x2, w2))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接