R/tidyverse中按多列分组实现条件字符串拼接的方法
解决方案
你之前的代码错误原因是group_by()仅传入了chapter一个分组字段,聚合时会忽略book的取值差异,把不同书卷下同编号的章节内容错误合并。只需要把两个分组维度同时传入分组函数即可,配合你正在使用的tidyverse生态工具(dplyr是tidyverse核心数据处理包,和tidyr完全兼容),实现代码如下:
library(dplyr) # 基础聚合版本 df_agg <- df %>% group_by(book, chapter) %>% summarise( text = paste(text, collapse = " "), .groups = "drop" )
补充说明
- 如果你的原始数据存在经文行顺序错乱的情况,可以先按
verse字段排序后再聚合,保证拼接后的文本和经文编号顺序一致:
df_agg <- df %>% # 按书卷、章节、经文序号排序,保证拼接顺序正确 arrange(book, chapter, verse) %>% group_by(book, chapter) %>% summarise( text = paste(text, collapse = " "), .groups = "drop" )
paste()函数的collapse参数可以自定义拼接间隔:如果需要用逗号加空格分隔文本,把参数值改成", "即可。- 代码中
.groups = "drop"参数的作用是聚合完成后自动移除数据的分组属性,避免后续数据处理操作受残留分组逻辑干扰。
运行上述代码后得到的输出和你给出的预期结果完全一致:
| book | chapter | text |
|---|---|---|
| 1 | 1 | string1 string2 |
| 1 | 2 | string3 string4 |
| 2 | 1 | string5 string6 |
| 2 | 2 | string7 string8 |
内容的提问来源于stack exchange,提问作者Laurin Kub
相关产品推荐
相关产品推荐

