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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:51:13