如何在R中按Col A聚合生成累积去重排序的字符串列
问题描述
我有如下数据表:
| 序号 | Col A | Col B |
|---|---|---|
| 1 | a | 2,3,4,5 |
| 2 | a | 3,5,6,7,8 |
| 3 | a | 1,2,4,9 |
| 4 | a | 3,5,7,11,12 |
我希望按Col A对该表进行聚合,得到如下格式的输出表:
| 序号 | Col A | Col B | Col C |
|---|---|---|---|
| 1 | a | 2,3,4,5 | 2,3,4,5 |
| 2 | a | 3,5,6,7,8 | 2,3,4,5,6,7,8 |
| 3 | a | 1,2,4,9 | 1,2,3,4,5,6,7,8,9 |
| 4 | a | 3,5,7,11,12 | 1,2,3,4,5,6,7,8,9,11,12 |
请指导我如何在R中实现这一需求?
实现方案
以下提供两种常用的R实现方式,均能达成目标:
方法一:使用dplyr + purrr包
这是tidyverse生态下的解决方案,代码可读性较强:
安装并加载依赖包
install.packages(c("dplyr", "purrr")) library(dplyr) library(purrr)构造示例数据
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 )生成累积去重的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()查看结果
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的性能更优:
安装并加载包
install.packages("data.table") library(data.table)转换为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
相关产品推荐
相关产品推荐

