如何用Base R按group列及id出现情况拆分data.frame?
基于Base R的DataFrame分组拆分方案
需求说明
需要将DataFrame按以下规则拆分:
- 拆分出单独的A组、B组、C组:仅包含对应group的行,且这些行的id只属于该单一group
- 拆分出AB组:包含所有成对出现的id(同一id同时对应A和B组的行,如示例中的17、18、19、20)对应的A、B行
示例数据
set.seed(123) # 固定随机种子,保证value值可复现 df = data.frame(id = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,17,18,18,19,19,20,20), group = c("A","A","A","A","A","A","A","A","B","B","B","B","C","C","C","C","A","B","A","B","A","B","A","B"), num = c(0.1,0.1,0.1,0.1,0.2,0.2,0.2,0.2,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1), value = c(sample(10:90, 16, replace = TRUE), rep(c(21,67,80,69), times=1, each=2)))
输出的df如下:
id group num value 1 1 A 0.1 35 2 2 A 0.1 83 3 3 A 0.1 46 4 4 A 0.1 88 5 5 A 0.2 66 6 6 A 0.2 81 7 7 A 0.2 42 8 8 A 0.2 79 9 9 B 0.1 65 10 10 B 0.1 33 11 11 B 0.1 90 12 12 B 0.1 45 13 13 C 0.1 70 14 14 C 0.1 43 15 15 C 0.1 48 16 16 C 0.1 21 17 17 A 0.1 21 18 17 B 0.1 21 19 18 A 0.1 67 20 18 B 0.1 67 21 19 A 0.1 80 22 19 B 0.1 80 23 20 A 0.1 69 24 20 B 0.1 69
Base R实现(可用split()完成)
步骤1:识别成对出现的id
先找出那些同时属于A和B组的id:
# 按id分组,判断每个id对应的group是否包含至少两个不同值(即同时有A和B) pair_ids <- unique(df$id[ave(df$group, df$id, FUN = function(x) length(unique(x))) == 2])
步骤2:构造拆分分组标签
为每一行分配对应的拆分标签:如果id属于成对id则标记为"AB",否则使用原group值:
split_labels <- with(df, ifelse(id %in% pair_ids, "AB", as.character(group)))
步骤3:用split()拆分数据
直接基于构造好的标签拆分DataFrame:
split_result <- split(df, split_labels)
结果验证
拆分后得到4个分组:
split_result$A:仅包含id 1-8的A组行split_result$B:仅包含id 9-12的B组行split_result$C:仅包含id 13-16的C组行split_result$AB:包含id 17-20的所有A、B行(共8行)
内容的提问来源于stack exchange,提问作者SchlaWiener
相关产品推荐
相关产品推荐

