【问题标题】:R Sample By Minimum Cell SizeR按最小像元大小采样
【发布时间】:2020-09-12 15:16:41
【问题描述】:
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))

我有包含学生考试成绩信息的“数据”。我希望:计算每个 SCHOOL 有多少 GRADE,然后对所有 SCHOOLS 取 GRADE 的最小值。像这样:

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

所以基本上在这个基本示例中,有两个学校和 7 年级和 8 年级:

SCHOOL 1 7 年级有 2 个 SCORE,SCHOOL 1 8 年级有 3 个 SCORE。

SCHOOL 2 7 年级有 1 个 SCORE,SCHOOL 2 8 年级有 4 个 SCORE。

因此,新数据包含 1 年级和 2 年级的 7 年级分数,以及 1 和 2 年级的 8 年级分数,这些分数是随机抽样的。

像这样:

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

【问题讨论】:

  • @akrun 你有什么建议和想法吗?
  • @Valentin 你有什么建议和想法吗?

标签: r data.table sample


【解决方案1】:

这将遵循您对如何逐步进行的描述。

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']

【讨论】:

  • 谢谢你介意解释一下你的最后一行是完美的!
  • 它按SCHOOLGRADE 拆分行,然后对它们的每个组合运行一次示例函数,以SCOREs 中的N(我们刚刚计算出来)。然后data.table 神奇地将桌子拼凑起来。 [, -'N'] 只是删除该列,您可以删除该位以查看其中的内容。
  • 那太好了,非常感谢,我还有一个问题。如果我有一堆其他变量,比如 SCORE,但我希望做同样的事情,那就是像我们一样选择行。是否可以对整个数据框执行此操作而不仅仅是“分数”?
  • 我在答案中添加了一行来改为这样做。
猜你喜欢
  • 2019-03-19
  • 2015-06-28
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2017-09-20
相关资源
最近更新 更多