R语言分组数据框按比例抽样问题:如何按组抽取约33%行?
R语言分组按比例随机抽样解决方案
原始数据
df <- data.frame( Story = c(rep("C", 6), rep("X", 9), rep("A", 15), rep("B",12)) )
需求
对每个Story分组随机抽取约33%的行,预期抽样量:
- 2个"C"(6×0.33≈1.98,向上取整为2)
- 3个"X"(9×0.33≈2.97,向上取整为3)
- 5个"A"(15×0.33≈4.95,向上取整为5)
- 4个"B"(12×0.33≈3.96,向上取整为4)
原代码问题
原代码中额外的mutate步骤属于冗余操作,无需生成ID和sample_size字段,直接在抽样步骤中计算每组样本量即可。
修正后的代码
library(dplyr) df %>% group_by(Story) %>% slice_sample(n = ceiling(n() * 0.33)) %>% ungroup()
代码说明
group_by(Story):按Story字段对数据分组slice_sample(n = ceiling(n() * 0.33)):分组后n()代表当前组的总行数,通过ceiling(n()*0.33)计算向上取整后的抽样行数,直接传递给slice_sample完成随机抽样ungroup():取消分组(可根据后续操作需求选择是否保留分组状态)
运行上述代码即可得到符合预期的抽样结果。
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

