如何在R中使用dplyr按条件合并同一分类下的多行数据为单行
实现思路
核心逻辑是在原有Category分组的基础上,新增「单引号外的内容」作为第二分组键,将同一Category下、单引号外内容完全一致的行归为同一组后做聚合:
- 先提取Description中单引号包裹的内容、以及单引号外的剩余内容作为两个辅助字段
- 按Category + 单引号外内容两个维度分组
- 分组聚合时拼接ID、拼接单引号内的内容,再组装为新的Description字段
完整实现代码
library(dplyr) library(stringr) # 示例数据 df <- data.frame( ID = 1:5, Description = c("'foo' is a dog", "'bar' is a dog", "'foo' is a cat", "'foo' is not a cat", "'bar' is a fish"), Category = c("A", "A", "B", "B", "C") ) # 处理逻辑 df %>% mutate( # 提取单引号内的内容 quote_content = str_extract(Description, "(?<=')[^']+(?=')"), # 提取单引号外的内容 non_quote_part = str_remove(Description, "^'.*?'") ) %>% # 按分类+单引号外内容双维度分组 group_by(Category, non_quote_part) %>% summarise( ID = paste(ID, collapse = ","), # 拼接单引号内容后组装回完整Description Description = paste0("'", paste(quote_content, collapse = ","), "'", non_quote_part), .groups = "drop" ) %>% # 调整输出列顺序和原结构对齐 select(ID, Category, Description)
如果不想依赖stringr包,也可以用base R的正则实现辅助字段提取,替换上述代码的mutate部分即可:
mutate( quote_content = gsub("^'(.*?)'.*", "\\1", Description), non_quote_part = gsub("^'.*?'(.*)", "\\1", Description) )
输出结果
| ID | Category | Description |
|---|---|---|
| 1,2 | A | 'foo,bar' is a dog |
| 3 | B | 'foo' is a cat |
| 4 | B | 'foo' is not a cat |
| 5 | C | 'bar' is a fish |
和需求的预期输出完全一致。
内容的提问来源于stack exchange,提问作者WenliL
相关产品推荐
相关产品推荐

