如何在 R 中按列有效地从数据表中采样?

How to efficiently sample from a datatable by column in R?

如何从 R 中的数据 table 中为列中的每个唯一变量高效地采样一行?例如,给定 data.table:

library(data.table)
set.seed(1)

dt <- data.table( 
                   A = sample(c("A", "B", "C", "D", "E"), 100, replace = T),
                   B = sample(1:100, 100, replace = T),
                   C = sample(101:200, 100, replace = T) 
                 )

我需要为 A 列中的每个唯一字符采样一行。例如:

out <- list()
for (i in 1:length(unique(dt$A))){
  out[[i]] <- dt[sample(dt[, .I[A == unique(dt$A)[i]]], 1, replace = T)]
}
out <- do.call("rbind", out)

但是,我应用它的数据 table 变化很大。有没有我可以用来提高性能的 data.table 方法?

您可以在 .N 上为每个组使用 sample 和 select 1 个随机行。

library(data.table)
set.seed(123)
dt[, .SD[sample(.N, 1)], A]

#   A   B   C
#1: A  31 143
#2: D  16 175
#3: B 100 165
#4: E  27 190
#5: C  90 197

dplyr 具有 slice_sample(以前的 sample_n)功能:

library(dplyr)
dt %>% group_by(A) %>% slice_sample(n = 1)