在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
相关产品推荐
相关产品推荐

