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

如何从dataframe中抽取N个完整分组?(优先tidyverse方案)

抽取DataFrame中N个完整分组的Tidyverse方案

核心思路

要抽取完整分组,核心是先随机选择N个分组标签,再过滤出这些标签对应的所有行,而非按分组抽样行数据。

基础实现步骤

  1. 生成示例数据
library(tidyverse)

df <- data.frame(
  group = c(rep("a", 3), rep("b", 2), "c", rep("d", 4)),
  value = 1:10
)
  1. 抽取指定数量的完整分组
# 随机选取2个分组标签
selected_groups <- df %>%
  distinct(group) %>%  # 获取所有唯一分组
  slice_sample(n = 2)  # 随机抽2个分组

# 过滤出选中分组的所有行
df %>%
  filter(group %in% selected_groups$group)

运行后会得到类似如下的随机结果(每次运行分组可能不同,但均为完整分组):

group value
1     a     1
2     a     2
3     a     3
4     c     6

为什么你的原有代码不对?

group_by(group) %>% slice_sample(n = 2) 的逻辑是对每个分组单独抽样2行数据,而非抽取整个分组,这和需求完全相反,因此会得到每个组的2条记录,而非完整的N个分组。

封装成可复用的自定义函数

如果需要多次使用,可以把逻辑封装成函数,支持传入任意分组列:

sample_full_groups <- function(data, group_col, n) {
  # 处理非标准评估的分组列
  group_col_sym <- ensym(group_col)
  
  # 随机抽取n个分组
  sampled_groups <- data %>%
    distinct(!!group_col_sym) %>%
    slice_sample(n = n)
  
  # 过滤出选中分组的所有数据
  data %>%
    filter(!!group_col_sym %in% sampled_groups[[as_string(group_col_sym)]])
}

# 使用示例:从df中抽取2个完整的group分组
sample_full_groups(df, group, 2)

内容的提问来源于stack exchange,提问作者ravinglooper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:10:59