如何在R语言中按Key分组生成排除当前行DataID的Duplicates列
解决方法:创建排除当前行的关联DataID列
首先,为保证结果可复现,先设置随机种子并生成示例数据:
set.seed(123) df <- data.frame(Key = c(rep("A", 2), rep("B", 4), rep("C", 3), rep("D", 2)), DataID = round(runif(11, min = 400, max = 500), digits = 0))
使用tidyverse工具可实现需求,核心思路是按Key分组后,从组内所有DataID中移除当前行的对应值,优化后的代码如下:
library(tidyverse) df_updated <- df %>% group_by(Key) %>% mutate( # 为每个分组生成包含所有DataID的列表 group_data = list(DataID), # 遍历每一行,从组内数据中排除当前行的DataID Duplicates = map2(group_data, DataID, ~ .x[.x != .y]) ) %>% # 移除临时辅助列 select(-group_data) %>% ungroup()
代码说明
group_by(Key):按Key分组,确保仅处理同一分组内的关联数据group_data = list(DataID):为每个分组创建包含该组所有DataID的列表列,作为后续过滤的数据源map2(group_data, DataID, ~ .x[.x != .y]):通过map2同时遍历分组数据列表和当前行的DataID,筛选出不等于当前行DataID的所有值,生成Duplicates列select(-group_data):移除临时创建的辅助列,保持数据整洁ungroup():取消分组,恢复数据框的普通结构
示例输出
运行代码后,df_updated的部分结果如下:
# A tibble: 11 × 3 Key DataID Duplicates <chr> <dbl> <list> 1 A 428 <dbl [1]> 2 A 478 <dbl [1]> 3 B 440 <dbl [3]> 4 B 488 <dbl [3]> 5 B 494 <dbl [3]> 6 B 441 <dbl [3]> 7 C 438 <dbl [2]> 8 C 469 <dbl [2]> 9 C 445 <dbl [2]> 10 D 470 <dbl [1]> 11 D 442 <dbl [1]>
展开列表列可见,每个Duplicates值都是当前Key分组中排除自身DataID后的所有关联值。
内容的提问来源于stack exchange,提问作者Rhenny
相关产品推荐
相关产品推荐

