R语言 如何使用数据表进行分组百分比抽样?

hgncfbus  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(258)

This post讨论了按组以不同百分比进行采样的例程。
但是如果你只想抽样,比如说,50%不按组替换,如果你想抽样50%按组替换,怎么办?
在dplyr中,你有sample_frac来执行这个操作,那么data.table呢?

jq6vz3qz

jq6vz3qz1#

可以将sample.N配合使用来获取比例。可以使用replace = TRUE进行替换采样(默认为FALSE):

DT = data.table(a = sample(1:2), b = sample(1:1000,20))
DT[, .SD[sample(.N, floor(.5 * .N))], by = a]

#     a   b
#  1: 2 552
#  2: 2 246
#  3: 2 979
#  4: 2 611
#  5: 2 469
#  6: 1 703
#  7: 1 909
#  8: 1 274
#  9: 1 279
# 10: 1 316

更快的替代方法是(摘自@akrun):

DT[DT[, .I[sample(.N, floor(0.5 * .N))], by = a]$V1]
c2e8gylq

c2e8gylq2#

如果要采样的data.table的组排序在整个模拟过程中保持稳定,则对于数千次复制,预先计算索引会使速度增加一倍以上。

library(data.table)

dt <- data.table(A = sample(1:10, 1e3, 1), B = sample(1000))

system.time(for (i in 1:1e4) dt[dt[, .I[sample(.N, .N%/%2)], A][[2]]])
#>    user  system elapsed 
#>    4.83    0.23    5.06
system.time({
  idx <- dt[,.(.(.I)), A][[2]]
  for (i in 1:1e4) dt[unlist(lapply(idx, function(x) sample(x, length(x)%/%2)))]
})
#>    user  system elapsed 
#>    1.78    0.13    1.90

相关问题