使用dplyr实现重复文本关联姓名的字符串列表汇总需求
问题:合并重复书籍对应的关联姓名列表
我有多个包含name和book列的数据框,需要找出book列中的重复项,并将每个重复项对应的所有关联姓名合并为单行列表。目前已通过dplyr统计出重复书籍的出现次数,但无法将姓名合并成单行。
可复现代码
# 创建两个数据框 books1 <- data.frame( name=rep("Ellie", 4), book= c("Anne of Green Gables", "The Secret Garden", "Alice in Wonderland", "A Little Princess")) books2 <- data.frame( name=rep('Jess', 6), book=c("Harry Potter", "Percy Jackson", "Anne of Green Gables", "Chronicles of Narnia", "Redwall", "A Little Princess")) # 合并为单个数据框 books <- bind_rows(books1, books2) # 目前的代码:仅统计重复次数 repeatbooks <- books %>% group_by(book) %>% summarize(n=n())
当前输出
book n 1 A Little Princess 2 2 Alice in Wonderland 1 3 Anne of Green Gables 2 4 Chronicles of Narnia 1 5 Harry Potter 1 6 Percy Jackson 1 7 Redwall 1 8 The Secret Garden 1
期望输出
book n name 1 A Little Princess 2 Ellie, Jess 2 Alice in Wonderland 1 Ellie 3 Anne of Green Gables 2 Ellie, Jess
错误尝试说明
之前尝试的代码会生成多行结果,无法将姓名合并为单行:
repeatbooks <- books %>% group_by(book) %>% summarize(n=n(), names=c(paste0(name), ', '))
问题在于c(paste0(name), ', ')会将每个姓名拆分为独立元素,导致summarize输出多行,而非合并成一个字符串。
解决方案
在summarize中使用paste(unique(name), collapse = ", "),通过unique去除同一本书对应的重复姓名(比如同一个人多次标记同一本书的情况),再用collapse参数将姓名列表拼接为单个字符串:
library(dplyr) # 合并数据并统计 repeatbooks <- books %>% group_by(book) %>% summarize( n = n(), name = paste(unique(name), collapse = ", ") ) # 可选:如果只需要保留重复出现(n≥2)的书籍,添加filter repeatbooks <- repeatbooks %>% filter(n >= 2)
运行后即可得到期望的输出:
book n name 1 A Little Princess 2 Ellie, Jess 2 Alice in Wonderland 1 Ellie 3 Anne of Green Gables 2 Ellie, Jess
内容的提问来源于stack exchange,提问作者Jaken
相关产品推荐
相关产品推荐

