如何从dataframe中抽取N个完整分组?(优先tidyverse方案)
抽取DataFrame中N个完整分组的Tidyverse方案
核心思路
要抽取完整分组,核心是先随机选择N个分组标签,再过滤出这些标签对应的所有行,而非按分组抽样行数据。
基础实现步骤
- 生成示例数据
library(tidyverse) df <- data.frame( group = c(rep("a", 3), rep("b", 2), "c", rep("d", 4)), value = 1:10 )
- 抽取指定数量的完整分组
# 随机选取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
相关产品推荐
相关产品推荐

