我有以下数据集(我的实际数据的简单版本),'数据',并且想要计算变量x1和x2的加权平均值,分别使用权重w1和w2,分成两组(由变量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))
此问题与weighted means by group and column类似,不同之处在于我的问题包含不同列的不同权重。我尝试使用数据表,但它遇到与()相同的加权错误。 提前感谢您的帮助。
答案 0 :(得分:8)
尝试
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 :(得分:4)
尝试:
library(dplyr)
data %>%
group_by(n) %>%
summarise(x1 = weighted.mean(x1, w1), x2 = weighted.mean(x2, w2))