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

使用dplyr::summarise+across与purrr::map按前缀列分组求和异常

问题分析与解决方案

你的代码返回分组后结果完全相同的核心原因不是across的.cols参数(虽然这个参数选index完全没必要),而是sumfunction里直接引用了全局的dat,没有使用分组后的子数据框——不管怎么分组,函数都在计算整个数据集的pre/post列总和,自然每个分组结果一致。

核心问题拆解

  1. sumfunction中的dat[glue("{.x}.pre")]直接调用全局数据集,而非分组后的子数据,导致分组逻辑彻底失效;
  2. across(.cols = index完全多余:你不需要对index列做任何操作,这个参数的选择本身就是错误的使用场景。

正确写法

方法一:dplyr原生批量写法(推荐,更简洁)

直接利用starts_with匹配前缀列,结合rowSums和sum实现分组求和:

dat %>%
  group_by(id) %>%
  summarise(
    across(all_of(var_names), ~ sum(rowSums(pick(starts_with(.x)), na.rm = TRUE)),
           .names = "{.col}")
  ) %>%
  ungroup()

方法二:修正你原有的purrr写法

调整sumfunction使其使用分组后的子数据框,同时去掉无效的across操作:

sumfunction <- map(
  var_names,
  ~function(.data){
    sum(.data[[glue::glue("{.x}.pre")]], .data[[glue::glue("{.x}.post")]], na.rm = TRUE)
  }
) %>% 
  setNames(var_names)

dat %>% 
  group_by(id) %>%
  summarise(!!!sumfunction) %>% 
  ungroup()

这里的关键是:

  • 把函数参数改为.data,引用分组后的子数据集;
  • 用!!!展开sumfunction,直接在summarise中生成对应列,无需借助across。

内容的提问来源于stack exchange,提问作者Marrrrie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:10:39