R语言按分组拼接列值时仅去重保留唯一值的实现方法
解决方案
原有写法的问题是直接对分组下的全量列值做拼接,没有提前去重,只要在拼接逻辑前增加unique()去重步骤即可实现需求。
可直接运行的代码
如果需要和给出的期望输出完全一致(拼接的逗号后无空格),使用paste加collapse = ","参数实现:
library(dplyr) # 示例数据 Data <- data.frame( Region = c(1,1,2,2), branch = c("A","A","B","B"), ID1 = c(1,1,2,2), ID2 = c(1,2,2,2), ID3 = c(2,2,2,3), ID4 = c(4,3,2,4) ) # 分组去重拼接代码 Data %>% group_by(Region, branch) %>% summarise( across(everything(), ~paste(unique(.), collapse = ",")), .groups = "drop" )
运行结果
运行上述代码将得到完全匹配需求的输出:
# A tibble: 2 × 6 Region branch ID1 ID2 ID3 ID4 <dbl> <chr> <chr> <chr> <chr> <chr> 1 1 A 1 1,2 2 4,3 2 2 B 2 2 2,3 2,4
说明
- 核心逻辑:对每个分组下的字段值,先用
unique()提取非重复值,再做字符串拼接,从根源上避免重复值被拼接 - 如果不介意拼接后的逗号后带空格,可以把
paste(unique(.), collapse = ",")替换为toString(unique(.)),效果等价,仅格式有差异 - 新增
.groups = "drop"参数是为了聚合完成后自动移除分组属性,避免后续数据处理受残留分组影响,是dplyr分组操作的推荐写法
内容的提问来源于stack exchange,提问作者akang
相关产品推荐
相关产品推荐

