【发布时间】:2019-10-29 23:06:51
【问题描述】:
对于机器学习模型训练,我尝试对具有分组变量的数据帧进行采样,以便使用不同的采样规则处理每个组。比如我的数据:
df = data.frame(value = 1:10, label=c("a", "a", "b", rep("c", 7)))
对于规模小于 3 的组,我想抽取整个组,而不是更多,而对于更大的组,我想抽取一个 3 号的样本而不进行替换。
所以在这里,结果可能是:df[c(1:3, 6,9,10),]
如果我使用group_by 和sample_n,我会收到尺寸错误。我想过使用拆分和差异化采样“手动”,然后再次绑定行,但是有没有更有效和直接的方法?
【问题讨论】:
-
您愿意接受 data.table 解决方案吗?如果是这样,你可以做类似
df[, if(.N <= 3) .SD else .SD[sample(3)], by=label]我认为。 -
@thelatemail 我从未使用过它,但为什么不呢?但我的代码出错(未使用的参数 by=label)
-
@agenis - 你需要先安装/加载 data.table 包,然后通过
setDT(df)转换成data.table。该包扩展了标准 data.frames。 -
setDT 没问题,谢谢