在R中筛选group与col_3均唯一的行,验证代码正确性
如何抽取group与col_3均唯一的4行样本
我需要从数据框中抽取4行数据,要求每行的group值唯一,且col_3值全局唯一。之前尝试的代码无法满足col_3不重复的要求,以下是问题分析和解决方案:
问题代码分析
最初的尝试代码:
rndmData <- mydata %>% filter(group %in% sample(unique(group), size = 4)) %>% group_by(group) %>% filter(col_3 %in% sample(unique(col_3), size = 4)) %>% slice_sample(n = 1) %>% ungroup()
这段代码的问题在于:先固定选择4个随机group,再在每个group内独立筛选col_3并抽取行。由于不同group间的col_3可能存在重叠,最终结果很容易出现col_3重复的情况,无法满足全局唯一的要求。
解决方案:迭代式筛选保证双重唯一性
我们可以通过迭代的方式,逐个选择符合条件的行:每次选择一个未使用过的group,并从该group中选一个未被使用过的col_3对应的行,直到选够4行。代码如下:
library(dplyr) # 设置随机种子保证结果可复现 set.seed(123) # 随机打乱所有group的顺序,增加随机性 random_group_order <- sample(unique(mydata$group)) # 初始化存储选中行和已使用col_3的变量 selected_rows <- list() used_col3 <- c() # 遍历随机排序的group for (g in random_group_order) { # 筛选当前group中col_3未被使用的行 available <- mydata %>% filter(group == g, !col_3 %in% used_col3) if (nrow(available) > 0) { # 从可用行中随机选1行 chosen_row <- available %>% slice_sample(n = 1) selected_rows <- append(selected_rows, list(chosen_row)) used_col3 <- c(used_col3, chosen_row$col_3) # 选够4行就停止循环 if (length(selected_rows) == 4) break } } # 合并选中的行得到最终结果 rndmData <- bind_rows(selected_rows)
代码说明
- 随机打乱group顺序:避免每次都按固定顺序选择group,保证随机性。
- 迭代筛选:每次只从当前group中选择未被使用过的
col_3对应的行,确保col_3全局唯一;同时每个group只处理一次,保证group唯一。 - 终止条件:选够4行后立即停止循环,提升效率。
运行这段代码后,得到的结果会满足group和col_3均唯一的要求,类似示例输出:
group col_2 col_3 col_4 1 A i_z 13 22 2 H q_z 11 24 3 D q_m 17 28 4 F i_z 15 26
内容的提问来源于stack exchange,提问作者Ajrhjnd
相关产品推荐
相关产品推荐

