【问题标题】:How to efficiently sample from a datatable by column in R? [duplicate]如何在 R 中按列有效地从数据表中采样? [复制]
【发布时间】:2020-12-25 17:48:24
【问题描述】:

如何有效地从 R 中的数据表中为列中的每个唯一变量采样一行?比如给定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)

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

【问题讨论】:

    标签: r data.table sample


    【解决方案1】:

    您可以在.N 上为每个组使用sample 并随机选择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)
    

    【讨论】:

    • 如果重复执行此操作,从set.key(dt, A) 开始以提高性能是有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多