R语言dplyr按ID分组拼接Path列未得到预期结果?
代码存在的核心问题
你的代码有两处关键错误,导致无法得到预期结果:
- 函数选型错误:
mutate()的逻辑是保留数据集全部原始行,为每一行计算列值,不会做分组后的行折叠。你需要的是每个分组(每个ID)仅返回1行聚合结果,应该使用分组聚合函数summarise()而非mutate()。 paste()参数使用错误:sep参数的作用是设置多个传入向量之间的拼接分隔符,要把单个向量里的多个元素折叠拼接成一个字符串,必须使用collapse参数指定元素间的分隔符。你原代码里仅给paste()传入了Path一个向量,设置sep参数完全不会生效,不会把同组的多个Path值合并。
另外你的分组逻辑遗漏了Name字段:目标输出需要保留Name列,且Name与ID是一一对应的绑定关系,仅按ID分组可能在同ID对应不同Name时出现随机取值的异常。
修正后的可运行代码
library(dplyr) df <- df |> group_by(Name, ID) |> summarise( pages = paste(Path, collapse = ", "), .groups = "drop" )
代码说明:
- 共同按Name、ID分组,保证聚合后两列的取值对应关系准确
summarise()会将每个分组折叠为单行结果,符合输出要求paste()使用collapse = ", "参数,会把同组下所有Path值按逗号加空格的格式拼接为单个字符串- 增加
.groups = "drop"参数,聚合完成后自动解除分组,避免后续数据处理受残留分组属性影响
运行以上代码后,将得到和你预期完全一致的输出结果:
Name|ID|pages Test|1|/home, /service Test|2|/about Test|3|/about, /service, /contact
内容的提问来源于stack exchange,提问作者Christopher Penn
相关产品推荐
相关产品推荐

