在R中按组合并多行:仅合并评论列,保留唯一帖子信息
解决Reddit帖子与评论数据合并问题
嘿,我来帮你搞定这个数据合并的需求!你现在的问题是已经处理了评论相关列的合并,但没保留帖子的唯一信息,而且用summarise_all()/summarise_at()时因为没区分帖子和评论列的处理逻辑导致出错,下面给你两种可行的解决方案:
方案一:手动指定列处理逻辑
如果帖子列不多,你可以直接在summarise()里逐个指定帖子列取唯一值(用first()或者unique()都可以,因为同一帖子ID下的帖子信息是重复的,取第一个值就等于保留唯一值),同时继续合并评论列:
library(dplyr) all_reddits <- all_posts_and_comments %>% group_by(id) %>% summarise( # 保留帖子相关字段的唯一值,这里假设你有title、body等字段,按需添加 title = first(title), body = first(body), post_score = first(post_score), post_created_date = first(post_created_date), # 合并评论相关字段,这里用逗号分隔,你也可以换成原来的斜杠 comment_id = paste(comment_id, collapse = ","), comment_author = paste(comment_author, collapse = ","), comment_body = paste(comment_body, collapse = ","), comment_score = paste(comment_score, collapse = ","), comment_created_date = paste(comment_created_date, collapse = ","), comment_link = paste(comment_link, collapse = ",") )
方案二:用across()批量处理(更简洁)
如果你的帖子列和评论列命名有规律(比如评论列都以comment_开头),可以用across()函数批量处理,不用逐个写列名,这也是dplyr 1.0.0版本后推荐的写法:
library(dplyr) all_reddits <- all_posts_and_comments %>% group_by(id) %>% summarise( # 对所有非评论列(即帖子相关列)取第一个值 across(-starts_with("comment_"), first), # 对所有评论列进行合并,用逗号分隔 across(starts_with("comment_"), ~paste(., collapse = ",")) )
补充说明:
- 为什么用
first()而不是unique()?因为同一帖子ID下的帖子信息理论上是完全重复的,first()效率更高;如果万一出现同一ID下帖子信息不一致的异常情况,你可以把first()换成paste(unique(.), collapse = ",")来保留所有不同值。 - 你之前用
summarise_all()出错是因为它会对所有列应用同一个函数,但帖子列需要取唯一值,评论列需要合并,逻辑不一样;summarise_at()如果没精准区分列组也会有同样问题,across()的灵活性正好解决这个问题。
内容的提问来源于stack exchange,提问作者user5319960
相关产品推荐
相关产品推荐

