在R语言中按分组将字符串合并为单个字符串的实现
按UID合并Name字符串的R语言实现
输入数据
library(dplyr) Input <- tibble( UID = c("Code001", "Code001","Code002","Code002","Code002","Code002","Code003","Code003","Code003","Code004","Code005","Code005"), Name = c("NameABC", "Name JHB", "NameYDB", "Name & KBC","Name-S-D-T", "Name DF-R","NameMEY", "Name PeU","Name Eed", "NameBOR", "Name-Ptg","NameLKD"))
需求说明
针对每个唯一的UID,将对应的Name值合并为单个字符串,规则如下:
- 仅1个
Name值:直接保留该值 - 2个
Name值:用&分隔 - 超过2个
Name值:前序值用逗号分隔,最后两个值用&分隔
期望输出
Output <- tibble( UID = c("Code001", "Code002","Code003","Code004","Code005"), Name = c("NameABC & Name JHB", "NameYDB, Name & KBC, Name-S-D-T & Name DF-R", "NameMEY, Name PeU & Name Eed", "NameBOR", "Name-Ptg & NameLKD"))
解决方案代码
使用dplyr分组处理即可实现需求:
library(dplyr) Input %>% group_by(UID) %>% summarise(Name = { n <- n() case_when( n == 1 ~ first(Name), n == 2 ~ paste(Name, collapse = " & "), n > 2 ~ paste(c(paste(Name[1:(n-2)], collapse = ", "), paste(Name[(n-1):n], collapse = " & ")), collapse = ", ") ) }, .groups = "drop")
代码逻辑说明
group_by(UID):按UID对数据分组- 分组内处理逻辑:
- 用
n()获取当前组的Name数量 - 通过
case_when分支判断:- 数量为1时,直接取组内唯一的Name值
- 数量为2时,用
paste加&合并两个值 - 数量大于2时,先合并前n-2个值为逗号分隔的字符串,再合并最后两个值为
&分隔的字符串,最后将这两部分用逗号连接
- 用
.groups = "drop":取消分组,返回标准的tibble结构
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

