来自data.table的样本

bum*_*bee 1 r subset data.table

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

假设数据是

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

我想做两件事:

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

我可以关注如何动态地从data.table中提取一些随机行并选择

dat[n=.N, a=a[sample(.N,1)], b=b[sample(.N,1)], group]
Run Code Online (Sandbox Code Playgroud)

但是我很害怕,这将选择ab彼此独立。有没有选择相同的方法?

Ice*_*can 7

第1部分

如果您要计算唯一ID的数量,并且某些ID在组内重复

dat[, .(n_ids = uniqueN(id)), group]
Run Code Online (Sandbox Code Playgroud)

如果ID在组内不重复,或者您不想唯一地对它们进行计数

dat[, .(n_ids = .N), group]
Run Code Online (Sandbox Code Playgroud)

第2部分

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

dat[dat[, .(id = sample(id, 1)), group], on = .(id, group)]
Run Code Online (Sandbox Code Playgroud)

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

dat[dat[, sample(.I, 1), group]$V1]
Run Code Online (Sandbox Code Playgroud)

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

dat[sample(.N), c(.SD[1], .N), keyby=group]
Run Code Online (Sandbox Code Playgroud)

  • 另一种方式:`dat [sample(.N),c(.SD [1],.N),keyby = group]` (3认同)