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

求助:在R中按Group列随机选取4条唯一分组的行

从分组数据中随机选取不重复分组的指定行数

需求说明

需要从包含分组(group列)的数据中随机选取4行,要求结果中每行来自不同的分组,即同一group不能出现多次。

原始数据

group  col_2  col_3   col_4
A      p_m     12      21
A      q_x     11      21
A      i_z     13      22
B      q_z     11      24
B      p_x     14      25
B      i_m     15      26
B      q_m     17      28
C      p_x     16      29
C      i_z     12      23
C      q_m     14      23
C      q_x     13      25 
D      p_z     11      25
D      i_z     15      26
D      q_m     17      28
D      q_x     14      29
E      p_x     13      30
E      i_m     15      26
E      q_m     17      28
E      p_x     16      29
F      i_z     12      23
F      q_x     13      25 
F      p_z     11      25
F      i_z     15      26
G      q_m     17      28
G      q_z     11      24
G      p_x     14      25
G      i_m     15      26
H      q_x     11      21
H      i_z     13      22
H      q_z     11      24
H      p_x     13      30

期望输出示例

group  col_2  col_3   col_4
A      i_z     13      22
H      i_z     13      22
D      q_m     17      28
F      p_z     11      25

错误尝试分析

你之前的代码问题在于:

  • 直接使用sample_n(5)是从整个数据集随机抽取5行,无法保证分组不重复;
  • sample_n(distinct(group), 5)和sample_n(unique(group), 5)的用法错误,sample_n的第一个参数是要抽取的行数,不能传入分组对象。

可行解决方案

下面提供两种基于dplyr的有效方法:

方法一:先按分组抽1行,再随机选指定数量的分组

library(dplyr)
set.seed(1234) # 设置随机种子保证结果可复现

rndmData <- mydata %>%
  group_by(group) %>%
  sample_n(1) %>% # 每个分组随机抽取1行
  ungroup() %>%
  sample_n(4) # 从所有分组的单行中随机选4个(即4个不同分组)

方法二:先随机选分组,再从每个选中分组抽1行

library(dplyr)
set.seed(1234)

# 先随机选取4个不重复的分组
selected_groups <- sample(unique(mydata$group), 4)

# 过滤出选中分组的数据,再每个分组抽1行
rndmData <- mydata %>%
  filter(group %in% selected_groups) %>%
  group_by(group) %>%
  sample_n(1) %>%
  ungroup()

两种方法都能满足需求:结果包含4行,每行来自不同的group,且是随机选取的。

内容的提问来源于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 11:50:45