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

在dplyr中执行summarise操作时如何保留额外指定列

R数据分组汇总保留作者列解决方案

原始数据结构

df <- data.frame(name = c("Acer laurinum", "Acer laurinum Hassk.", "Acmella paniculata", 
                          "Adinandra cf. integerrima", "Adinandra cf. integerrima T.Anderson"),
                 value1 = c(1,2,3,4,5),
                 value2 = c(2,3,4,5,6))

需求说明

基于name列拆分出的物种名称部分分组,对value1、value2列执行求和汇总,同时保留每个分组对应的唯一作者信息,无作者的分组保留NA。

原有代码问题

原有代码仅完成数值列汇总,author列会被丢弃:

df %>%
  mutate(author = str_extract(name, "(?<=\\s)(?=.*\\.)[.\\w]+$"),
         name1 = trimws(str_remove(name, "(?<=\\s)(?=.*\\.)[.\\w]+$"))) %>%
  group_by(name1) %>%
  summarise(across(c(value1, value2), sum))

修改后代码

只需在summarise中补充提取author列的非空唯一值即可:

library(dplyr)
library(stringr)

df %>%
  mutate(author = str_extract(name, "(?<=\\s)(?=.*\\.)[.\\w]+$"),
         name1 = trimws(str_remove(name, "(?<=\\s)(?=.*\\.)[.\\w]+$"))) %>%
  group_by(name1) %>%
  summarise(
    across(c(value1, value2), sum),
    author = unique(na.omit(author))
  )

输出结果

# A tibble: 3 × 4
  name1                     value1 value2 author    
  <chr>                      <dbl>  <dbl> <chr>     
1 Acer laurinum                  3      5 Hassk.    
2 Acmella paniculata             3      4 <NA>      
3 Adinandra cf. integerrima      9     11 T.Anderson

逻辑说明

每个分组下的author列要么全为NA,要么仅存在一个有效非空值,na.omit(author)会过滤掉所有空值,unique()提取唯一值,若过滤后无有效值则自动返回NA,完全匹配需求。如果存在同物种多作者的场景,可以将author的处理逻辑改为author = toString(unique(na.omit(author))),多个作者会自动用逗号拼接。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:09:02