我有一个如下所示的数据集:
a <- data.frame(cat = c("a","b","b","c","a","c"),
num1 = c(-2,1,2,4,3,2),
num2 = c(-2,3,1,5,3,2),
weight = c(3.12,2,14,1.12,1,12))
我试图获得每个“num”列的加权平均值(在我的真实数据集上,我有许多“num”列,全部命名相同)。
我开始这样编码:
a %>% summarise(num1 = weighted.mean(num1,weight,na.rm=T),
num2 = weighted.mean(num2,weight,na.rm=T))
回报:
数字1 | 数字2 |
---|---|
1.661853 | 1.394705 |
但是由于我必须处理许多列,所以我采用了这种方式:
a %>% summarise(across(contains("num"), ~weighted.mean(.x,na.rm=T)))
或:
a %>% summarise_at(.vars=vars(contains("num")),
function(x,weight) weighted.mean(x,weight))
他们都回来了:
数字1 | 数字2 |
---|---|
1.666667 | 2 |
为什么我在这里得到不同的结果?我应该相信哪种方式?
谢谢!
您在第二个选择中错过了
weight
,请尝试:
a %>%
summarise(across(contains("num"), ~weighted.mean(.x, weight, na.rm=TRUE)))
num1 num2
1 1.661853 1.394705
这是第三种方法的替代方法:
a %>%
summarise_at(.vars=vars(contains("num")),
function(x,weight) weighted.mean(x, w=.$weight, na.rm=TRUE))
num1 num2
1 1.661853 1.394705