按最小像元大小的 R 样本

R Sample By Minimum Cell Size

set.seed(1)
data=data.frame(SCHOOL = rep(1:10, each = 1000), GRADE = sample(7:12, r = T, size = 10000),SCORE = sample(1:100, r = T, size = 10000))

我有 'data',其中包含有关学生考试成绩的信息。我希望:统计每所学校有多少个GRADE,然后对所有学校取GRADE的最小值。像这样:

对于每个学校,计算特定年级的行数。 然后为每个年级找到所有学校中的最小值。 最后,我希望根据步骤 2 中找到的最小值进行随机抽样。

所以基本上在这个有两个学校和 GRADE 7 和 GRADE 8 的基本示例中:

学校 1 的 7 年级分数为 2,学校 1 的八年级分数为 3。

学校 2 的 7 年级分数为 1,学校 2 的 8 年级分数为 4。

因此,新数据包含 SCHOOL 1 和 SCHOOL 2 的 GRADE 7 的一个 SCORE,以及 SCHOOL 1 和 SCHOOL 2 的 GRADE 8 的三个 SCORE,这些被挑选的 SCORE 是随机抽样的。

像这样:

我的尝试: data[ .SD[sample(x = .N, size = min(sum(GRADE), .N))], by = .(SCHOOL,GRADE]

这遵循您对操作方法的描述 step-by-step。

library(data.table)
setDT(data)
data[, N := .N, .(SCHOOL, GRADE)]
data[, N := min(N), GRADE]
data[, .(SCORE = sample(SCORE, N)), .(SCHOOL, GRADE, N)][, -'N']

如果您有多个类似 SCORE 的列,并且您希望每个列都保留相同的行,那么您可以像尝试那样使用 .SD

data[, .SD[sample(.N, N)], .(SCHOOL, GRADE, N)][, -'N']