5

我有以下数据集(我的实际数据的简单版本)“数据”,并且想分别使用权重 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))

这个问题类似于group 和 column 的加权平均值,除了我的问题包括不同列的不同权重。我尝试使用数据表,但它遇到与 with() 相同的加权错误。提前感谢您的帮助。

4

2 回答 2

9

尝试

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

或者正如@thelatemail 评论的那样,我们可以使用Map循环“x's”,相应的“w's”列并使用单个调用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]
于 2015-06-11T04:54:17.050 回答
4

尝试:

library(dplyr)
data %>% 
  group_by(n) %>% 
  summarise(x1 = weighted.mean(x1, w1), x2 = weighted.mean(x2, w2))
于 2015-06-11T04:54:26.717 回答