基于交叉表双条件随机删除数据框子组行的实现问询
实现基于交叉表的双条件随机删除子组行
看起来你已经完成了group和outcome的交叉表分析,现在想要针对每个(group, outcome)组合的子组,随机删除其中的部分行。下面我会给出几种实用的实现方法,涵盖不同的需求场景:
场景1:指定每个子组保留的固定行数
如果希望每个group-outcome子组最终保留固定行数(比如50行,原行数不足则全部保留),可以用dplyr包的分组抽样功能,代码如下:
library(dplyr) # 先确认原交叉表的子组行数 mytable <- table(Data$outcome, Data$group) print(mytable) # 设置每个子组要保留的目标行数 target_n <- 50 # 分组后随机抽样保留目标行数 Data_filtered <- Data %>% group_by(group, outcome) %>% slice_sample(n = min(n(), target_n)) %>% # n()是当前组的行数,取最小值避免报错 ungroup() # 验证筛选后的交叉表 table(Data_filtered$outcome, Data_filtered$group)
场景2:按比例随机删除子组行
如果想按比例删除每个子组的行(比如删除30%,保留70%),同样可以用dplyr实现:
keep_prop <- 0.7 # 保留70%的行,即删除30% Data_filtered <- Data %>% group_by(group, outcome) %>% slice_sample(prop = keep_prop) %>% ungroup() # 验证结果 table(Data_filtered$outcome, Data_filtered$group)
场景3:仅针对特定子组删除行
如果只需要对某个特定的group-outcome组合(比如group=one且outcome=yes)进行删除操作,可以直接定位目标行后随机抽样删除:
# 定位目标子组的所有行索引 target_subset <- which(Data$group == "one" & Data$outcome == "yes") # 随机选择要删除的行数(比如20行) delete_indices <- sample(target_subset, size = 20) # 删除指定行 Data_filtered_specific <- Data[-delete_indices, ] # 验证结果 table(Data_filtered_specific$outcome, Data_filtered_specific$group)
不用dplyr的base R实现
如果你偏好base R,可以通过遍历子组来实现:
# 用interaction生成group和outcome的组合标识 group_combinations <- interaction(Data$group, Data$outcome) unique_groups <- unique(group_combinations) # 存储筛选后的子组数据 filtered_data_list <- list() # 遍历每个子组 for(g in unique_groups){ # 获取当前子组的所有行 current_group_rows <- Data[group_combinations == g, ] # 随机抽样保留50行(可根据需求修改) sampled_rows <- current_group_rows[sample(nrow(current_group_rows), min(nrow(current_group_rows), 50)), ] filtered_data_list[[g]] <- sampled_rows } # 合并所有子组数据 Data_filtered_base <- do.call(rbind, filtered_data_list) # 验证 table(Data_filtered_base$outcome, Data_filtered_base$group)
这些方法都能精准地基于group和outcome双条件实现子组内的随机删除操作,你可以根据自己的具体需求选择合适的方案。
内容的提问来源于stack exchange,提问作者Ivo
相关产品推荐
相关产品推荐

