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

如何在R中按Col A聚合生成累积去重排序的字符串列

问题描述

我有如下数据表:

序号Col ACol B
1a2,3,4,5
2a3,5,6,7,8
3a1,2,4,9
4a3,5,7,11,12

我希望按Col A对该表进行聚合,得到如下格式的输出表:

序号Col ACol BCol C
1a2,3,4,52,3,4,5
2a3,5,6,7,82,3,4,5,6,7,8
3a1,2,4,91,2,3,4,5,6,7,8,9
4a3,5,7,11,121,2,3,4,5,6,7,8,9,11,12

请指导我如何在R中实现这一需求?


实现方案

以下提供两种常用的R实现方式,均能达成目标:

方法一:使用dplyr + purrr包

这是tidyverse生态下的解决方案,代码可读性较强:

  1. 安装并加载依赖包

    install.packages(c("dplyr", "purrr"))
    library(dplyr)
    library(purrr)
    
  2. 构造示例数据

    df <- data.frame(
      序号 = 1:4,
      Col_A = c("a", "a", "a", "a"),
      Col_B = c("2,3,4,5", "3,5,6,7,8", "1,2,4,9", "3,5,7,11,12"),
      stringsAsFactors = FALSE
    )
    
  3. 生成累积去重的Col C
    核心逻辑是按Col_A分组后,逐步累积所有行的Col_B元素,去重排序后合并为字符串:

    result <- df %>%
      group_by(Col_A) %>%
      mutate(
        # 将每行Col B拆分为字符向量列表
        split_b = strsplit(Col_B, ","),
        # 累积合并所有之前行的split_b
        cumulative_b = accumulate(split_b, ~c(.x, .y)),
        # 去重、排序后合并为字符串,得到Col C
        Col_C = map_chr(cumulative_b, ~paste(sort(unique(.x)), collapse = ","))
      ) %>%
      # 移除中间辅助列
      select(-split_b, -cumulative_b) %>%
      ungroup()
    
  4. 查看结果

    print(result)
    

    输出与目标表一致:

    # A tibble: 4 × 4
      序号 Col_A Col_B       Col_C                         
    <int> <chr> <chr>       <chr>                         
    1     1 a     2,3,4,5     2,3,4,5                       
    2     2 a     3,5,6,7,8   2,3,4,5,6,7,8                 
    3     3 a     1,2,4,9     1,2,3,4,5,6,7,8,9             
    4     4 a     3,5,7,11,12 1,2,3,4,5,6,7,8,9,11,12       
    

方法二:使用data.table包

如果处理大数据集,data.table的性能更优:

  1. 安装并加载包

    install.packages("data.table")
    library(data.table)
    
  2. 转换为data.table并处理

    dt <- as.data.table(df)
    result_dt <- dt[, {
      # 拆分所有Col B为列表
      split_list <- strsplit(Col_B, ",")
      # 累积合并列表元素
      cumulative_list <- Reduce(function(x, y) c(x, y), split_list, accumulate = TRUE)
      # 生成Col C
      Col_C <- sapply(cumulative_list, function(x) paste(sort(unique(x)), collapse = ","))
      # 返回结果列
      .(Col_B = Col_B, Col_C = Col_C)
    }, by = Col_A][, 序号 := 1:.N][]
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:05:20