我有一些data.table,我想从中选择一个随机子集,但仅用于某些操作。
假设数据是
dat <- data.table(id=1:100, group=sample(1:20,100, replace=TRUE), a=runif(100), b=rnorm(100))
我想做两件事:
a
和b
上我可以关注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]
但是,恐怕这会彼此独立地选择a
和b
。有没有选择相同的方法?
答案 0 :(得分:7)
如果您要计算唯一ID的数量,并且某些ID在组内重复
dat[, .(n_ids = uniqueN(id)), group]
如果ID在组内不重复,或者您不想唯一地对它们进行计数
dat[, .(n_ids = .N), group]
如果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]