【问题标题】:sample from data.table来自 data.table 的样本
【发布时间】:2019-06-25 19:14:39
【问题描述】:

我有一些 data.table,我想从中选择一个随机子集,但仅适用于某些操作。

假设数据是

dat <- data.table(id=1:100, group=sample(1:20,100, replace=TRUE), a=runif(100), b=rnorm(100))

我想做两件事:

  1. 统计每组的 id 数量
  2. 从每个组中随机选择一个id,并将其值记录在ab

我可以关注How do you extract a few random rows from a data.table on the fly并选择

dat[n=.N, a=a[sample(.N,1)], b=b[sample(.N,1)], group]

但我担心,这会相互独立地选择ab。有没有办法选择相同的?

【问题讨论】:

  • 在 j 中使用 {} 来做多个表达式——首先,从 .I 中通过 sample()ing 选择一个索引,然后将此随机索引应用于两个向量

标签: r data.table subset


【解决方案1】:

第 1 部分

如果您想计算唯一 id 的数量并且某些 id 在组内重复

dat[, .(n_ids = uniqueN(id)), group]

如果 id 在组内不重复,或者您不想在唯一的基础上计算它们

dat[, .(n_ids = .N), group]

第 2 部分

如果 id 在组内重复,并且您希望返回每个组中随机选择的 id 的所有行

dat[dat[, .(id = sample(id, 1)), group], on = .(id, group)]

如果 id 不重复,或者您只希望每组一行

dat[dat[, sample(.I, 1), group]$V1]

感谢 Frank 的评论,您还可以在一行中为上面的第 1 部分和第 2 部分执行第二个选项。这将返回类似dat[dat[, sample(.I, 1), group]$V1] 的行,但还会添加一列N 显示id 的数量(假设等于组中的行数)

dat[sample(.N), c(.SD[1], .N), keyby=group]

【讨论】:

  • 另一种方式:dat[sample(.N), c(.SD[1], .N), keyby=group]
猜你喜欢
  • 1970-01-01
  • 2010-10-02
  • 2022-12-09
  • 2017-04-23
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
相关资源
最近更新 更多