为了进行机器学习模型训练,我正在尝试对具有分组变量的数据框进行采样,以便对每个组使用不同的采样规则。例如,我的数据:
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
,则会出现尺寸错误。我曾想过使用拆分和差异采样进行“手动”操作,然后再次绑定行,但是有没有更有效和直接的方法?
[创建了组大小的n
列后,我在sample_n
中使用了它
df %>% group_by(label) %>% sample_n(min(n(), 3))
# A tibble: 6 x 3
# Groups: label [3]
# value label n
# <int> <fct> <int>
#1 1 a 2
#2 2 a 2
#3 3 b 1
#4 5 c 7
#5 10 c 7
#6 4 c 7
如果不需要多余的列,可以在末尾添加%>% select(-n)
。
在分组数据上,您可以使用runif()
创建一个随机值,并保留按row_number()
排序的这些值小于或等于3的情况。
df %>%
group_by(label) %>%
filter(row_number(runif(n())) <= 3)