R语言按name列相似字符串聚合行求和并保留带作者的完整名称
R实现按相似物种名聚合行的方案
你描述的相似名称符合「短名称是带作者后缀的完整长名称的前缀」的规律,可按先匹配完整名称、再分组求和的逻辑实现需求,以下是可直接运行的代码:
环境准备与示例数据
# 加载依赖包 library(dplyr) library(stringr) library(purrr) # 构造示例数据框 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))
处理步骤
# 1. 提取所有完整长名称:没有其他名称以它为前缀的即为完整名称 all_names <- unique(df$name) full_names <- keep(all_names, function(x) { sum(str_starts(all_names, fixed(x))) == 1 }) # 2. 为每行数据匹配对应的完整名称 df <- df %>% mutate( full_name = map_chr(name, function(x) { matched <- full_names[str_starts(full_names, fixed(x))] ifelse(length(matched) == 1, matched, x) }) ) # 3. 按完整名称分组对数值列求和 result <- df %>% group_by(full_name) %>% summarise( across(starts_with("value"), sum), .groups = "drop" ) %>% rename(name = full_name)
输出结果
运行上述代码后得到的result和你预期的输出完全一致:
name value1 value2 1 Acer laurinum Hassk. 3 5 2 Acmella paniculata 3 4 3 Adinandra cf. integerrima T.Anderson 9 11
扩展说明
如果实际数据中的相似名称不是严格的前缀匹配,可引入stringdist包,将上述前缀匹配逻辑替换为字符串编辑距离小于设定阈值的匹配逻辑,即可实现模糊相似的匹配聚合。
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

