You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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)

代码说明

  1. 随机打乱group顺序:避免每次都按固定顺序选择group,保证随机性。
  2. 迭代筛选:每次只从当前group中选择未被使用过的col_3对应的行,确保col_3全局唯一;同时每个group只处理一次,保证group唯一。
  3. 终止条件:选够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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:01:20