You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:45:03