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
2条答案
按热度按时间jq6vz3qz1#
可以将
sample
与.N
配合使用来获取比例。可以使用replace = TRUE
进行替换采样(默认为FALSE
):更快的替代方法是(摘自@akrun):
c2e8gylq2#
如果要采样的
data.table
的组排序在整个模拟过程中保持稳定,则对于数千次复制,预先计算索引会使速度增加一倍以上。