data.table
решение. dat[, .N, Level]
дает количество строк для каждой группы Levels
, тогда min(N)
, т.е. minN
- это наименьшее количество строк. Следующая строка занимает верхние minN
строки из каждой группы.
library(data.table)
setDT(dat)
minN <- dat[, .N, Level][, min(N)]
dat[, head(.SD, minN), Level]
# Level x
# 1: A 1.2724293
# 2: A 0.4146414
# 3: B -0.9285670
# 4: B -0.2947204
# 5: C 2.4046534
# 6: C 0.7635935
# 7: D -0.2894616
# 8: D -0.2992151
# 9: E 0.4356833
# 10: E -1.2375384
Если вы хотите выбрать случайные строки, вы можете смешать dplyr
и data.table
library(dplyr)
dat[, sample_n(.SD, minN), Level]
Или используйте решение в комментарии arg0naut
dat[, .SD[sample(.N, minN)], by = Level]
Если вы готовы пожертвовать некоторой читабельностью ради скорости, другой вариант -
dat[dat[, sample(.I, minN), Level]$V1]
Использованные данные (из ответа Руи Баррадаса)
set.seed(1)
s <- sample(2:5, 5, TRUE)
Level <- sapply(1:5, function(i) rep(LETTERS[i], each = s[i]))
Level <- factor(unlist(Level))
dat <- data.frame(x = rnorm(length(Level)), Level)