如何按Numeric_variable分组拆分数据集并保留全1单元至两个子集?
解决方案
核心思路
先识别每个Unit的数值特征:
- 包含数值2的Unit(A、C)归为第一组
- 包含数值3的Unit(B、D)归为第二组
- 所有数值均为1的Unit(E、F)作为公共部分,同时加入两个分组
使用dplyr实现(推荐)
加载dplyr包后按步骤操作:
library(dplyr) # 1. 标记每个Unit所属分组 unit_groups <- df %>% group_by(Unit) %>% summarise( has_2 = 2 %in% Numeric_variable, has_3 = 3 %in% Numeric_variable, all_1 = all(Numeric_variable == 1), .groups = "drop" ) %>% mutate(group = case_when( has_2 ~ "group1", has_3 ~ "group2", all_1 ~ "common" )) # 2. 提取公共部分数据 common_data <- df %>% filter(Unit %in% unit_groups$Unit[unit_groups$group == "common"]) # 3. 生成目标数据集 df1 <- df %>% filter(Unit %in% unit_groups$Unit[unit_groups$group == "group1"]) %>% bind_rows(common_data) df2 <- df %>% filter(Unit %in% unit_groups$Unit[unit_groups$group == "group2"]) %>% bind_rows(common_data)
使用Base R实现
无需额外包,用基础R代码完成:
# 1. 提取每个Unit的唯一数值集合 unit_unique_vals <- tapply(df$Numeric_variable, df$Unit, unique) # 2. 筛选各分组对应的Unit group1_units <- names(unit_unique_vals)[sapply(unit_unique_vals, function(x) 2 %in% x)] group2_units <- names(unit_unique_vals)[sapply(unit_unique_vals, function(x) 3 %in% x)] common_units <- names(unit_unique_vals)[sapply(unit_unique_vals, function(x) all(x == 1))] # 3. 合并生成最终数据集 df1 <- rbind(df[df$Unit %in% group1_units, ], df[df$Unit %in% common_units, ]) df2 <- rbind(df[df$Unit %in% group2_units, ], df[df$Unit %in% common_units, ])
结果验证
运行代码后,df1会包含A、C、E、F的所有记录,df2会包含B、D、E、F的所有记录,与你期望的输出完全匹配。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

