如何在tidyverse中结合group_by()与sample()按study分组筛选对应group行
按study随机筛选对应group行的实现方法
完整可运行代码
library(tidyverse) # 构造示例数据集 data <- expand_grid(study=1:3,group=1:2,outcome=c("A","B"), time=0:1) %>% as.data.frame() # 提取所有唯一study值,用于后续生成一一对应的筛选规则 unique_studies <- unique(data$study) # 为每个study生成随机筛选规则:0取全部、1取group=1、2取group=2 group_row <- sapply(seq_along(unique_studies), function(i) sample(0:2, 1, replace = TRUE)) # 生成study与筛选规则的映射表,方便匹配 study_rule <- tibble(study = unique_studies, select_rule = group_row) # 按规则筛选数据 result <- data %>% left_join(study_rule, by = "study") %>% group_by(study) %>% filter(select_rule == 0 | group == select_rule) %>% select(-select_rule) %>% ungroup() %>% arrange(study, group, outcome, time)
核心逻辑说明
- 先为每个study生成一一对应的筛选规则,避免规则和study错位
- 筛选条件
select_rule == 0 | group == select_rule刚好匹配需求:- 规则为0时,
select_rule ==0判断为真,该study下所有行都保留 - 规则为1/2时,仅保留group等于对应规则值的行
- 规则为0时,
原代码问题说明
- 错误按
group分组,需求是按study分组处理 - 没有将随机生成的
group_row和每个study做对应匹配,循环范围1:2和study数量不匹配 - 规则为0时用
unique(data$group)和group做比较,会出现向量长度不匹配的逻辑错误
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

