问题描述
set.seed(1)
data=data.frame(SCHOOL = rep(1:10,each = 1000),GRADE = sample(7:12,r = T,size = 10000),score = sample(1:100,size = 10000))
我有“数据”,其中包含有关学生考试成绩的信息。我希望:计算每个学校有多少GRADE,然后将所有学校的GRADE取最小值。像这样:
对于每个学校,计算特定GRADE的行数。 然后为每个GRADE找到所有学校中的最小值。 最后,我希望根据第2步中找到的最小值进行随机抽样。
因此,在这个基本示例中,基本上有两个SCHOOL和GRADE 7和GRADE 8:
学校1为GRADE 7分配了2个分数,而学校1为GRADE 8分配了3个分数。
SCHOOL 2对GRADE 7具有1个评分,而SCHOOL 2对GRADE 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))],由=。(SCHOOL,GRADE]
解决方法
这是您对逐步操作的说明。
library(data.table)
setDT(data)
data[,N := .N,.(SCHOOL,GRADE)]
data[,N := min(N),GRADE]
data[,.(SCORE = sample(SCORE,N)),GRADE,N)][,-'N']
如果您有多个类似SCORE
的列,并且每个列都希望保留相同的行,则可以像尝试这样使用.SD
:
data[,.SD[sample(.N,N)],-'N']