【问题标题】:More efficient block resampling of R dataframeR数据帧的更有效的块重采样
【发布时间】:2020-09-16 08:50:24
【问题描述】:

我正在尝试以集群/阻塞方式重新采样 R 数据帧。我正在使用下面的代码 sn-p 这样做,但速度很慢:

    index_sample <- sample(unique(data[[cluster_var]]), 
                           size=length(unique(data[[cluster_var]])), replace=T)

    indices <- unlist(sapply(index_sample, FUN=function(x) {which(data[[cluster_var]] == x)}))

有没有更有效的方法来做到这一点?特别是 unlist/sapply 步骤似乎非常缓慢。

期望行为示例:

set.seed(1919)
data <- data.frame(x=sample(seq(1,5,1), 20, replace=TRUE),
                   y = runif(20))
index_sample <- sample(unique(data[['x']]), 
                       size=length(unique(data[['x']])), replace=T)
indices <- unlist(sapply(index_sample, FUN=function(x) {which(data[['x']] == x)}))
print(indices)
[1]  7  8  9 10 14 17 20  7  8  9 10 14 17 20  1 12  2 18 19  6 11 13 16    

【问题讨论】:

    标签: r dataframe sampling sapply


    【解决方案1】:

    我们可以使用outer

    indices2 <- which(outer(data$x, index_sample, FUN = `==`), arr.ind = TRUE)[,1]
    

    -使用 OP 的解决方案进行测试

    identical(indices, indices2)
    #[1] TRUE
    

    【讨论】:

    • 已删除。这个解决方案更快,谢谢!现在不打算“接受”它,以防有可能找到更有效的解决方案,但假设没有人在几个小时内分享的更快的替代方案,届时将接受。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多