You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)
)
输出结果
IDCategoryDescription
1,2A'foo,bar' is a dog
3B'foo' is a cat
4B'foo' is not a cat
5C'bar' is a fish

和需求的预期输出完全一致。

内容的提问来源于stack exchange,提问作者WenliL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:18:02