R语言中循环实现dataframe删除流程且保留全部study的方法问询
这个流程完全可以通过循环实现,同时满足你提到的「study不被完全删除」的约束,核心思路是禁止同一study被多轮选中,避免同一个study的所有outcome都被删除。
实现代码
library(tidyverse) # 原始示例数据 data <- expand_grid(study = 1:5, group = 1:2, outcome = c("A", "B")) # 自定义参数,可根据需求修改 n_per_round <- 1 # 每轮采样的study数量 outcome_remove_list <- c("A", "B") # 每轮要删除的outcome,长度对应循环轮次 used_studies <- c() # 记录已被选中过的study,避免重复选取 result_data <- data # 初始化结果数据 # 循环执行删行逻辑 for (outcome_to_remove in outcome_remove_list) { # 仅从未被选过的study中采样,保证同一study最多被删一次 available_studies <- setdiff(unique(result_data$study), used_studies) studies_to_remove <- sample(available_studies, size = n_per_round) # 执行删行 result_data <- result_data %>% filter(!(study %in% studies_to_remove & outcome %in% outcome_to_remove)) # 更新已使用的study列表 used_studies <- c(used_studies, studies_to_remove) } # 输出最终结果 result_data # 验证约束:循环前后unique(study)数量完全一致 length(unique(data$study)) == length(unique(result_data$study)) # 固定返回TRUE
扩展性说明
如果后续需要新增删除轮次,仅需要在outcome_remove_list中追加对应要删除的outcome值即可,无需修改循环主体逻辑;如果需要每轮采样不同数量的study,也可以把n_per_round修改为和outcome_remove_list长度一致的向量,每轮取对应位置的采样数即可适配需求。
内容的提问来源于stack exchange,提问作者rnorouzian
相关产品推荐
相关产品推荐

