如何在R的summarise_if/summarise_at中使用需两个数据集变量的函数
正确实现方法
1 适配summarise_if的写法
你可以用dplyr提供的cur_data()函数获取当前计算上下文的数据集(分组场景下会自动取当前组的子集),不需要硬编码调用全量数据集的变量:
# 不分组计算加权均值 library(tidyverse) df <- as_tibble(iris) df %>% summarise_if(is.numeric, .fun = function(x) weighted.mean(x, w = cur_data()$Sepal.Length)) # 分组计算加权均值 df %>% group_by(Species) %>% summarise_if(is.numeric, .fun = function(x) weighted.mean(x, w = cur_data()$Sepal.Length))
2 更推荐的新版dplyr写法
dplyr 1.0.0之后已经推荐用across()替代原有的_if/_at/_all系列scoped函数,写法更简洁,且天然支持数据掩码,直接在匿名函数中引用权重变量即可:
# 不分组计算加权均值 df %>% summarise(across(where(is.numeric), ~ weighted.mean(.x, w = Sepal.Length))) # 分组计算加权均值 df %>% group_by(Species) %>% summarise(across(where(is.numeric), ~ weighted.mean(.x, w = Sepal.Length)))
原报错原因说明
你之前的写法报错,是因为summarise_if的额外传参(...部分的w参数)不会在数据集的掩码环境中检索变量,只会去全局环境搜索,因此找不到数据集内的Sepal.Length;而用df$Sepal.Length的写法是直接调用全量数据集的权重列,分组后每组的变量长度和全量权重长度不匹配,就会触发长度不一致的报错。
内容的提问来源于stack exchange,提问作者Ari.stat
相关产品推荐
相关产品推荐

