提高bootstrap功能的效率

问题描述 投票:0回答:1

我有一个大数据框,我想从中为每一列抽取随机样本。我想多次采样并将结果总和存储在新的数据框中。

我的数据框如下所示:

library(microbenchmark)
library(plyr)
library(tidyverse)

set.seed(123)
df <- data.frame(matrix(sample(0:10, replace = T), nrow = 1000, ncol=60))

我编写了一个函数来从我的数据帧中采样并计算我的统计数据。

rd <- function(x) sample(x, size = N, replace =TRUE)
N <- nrow(df)

sampling <- function(df){
  df_s <- apply(df, 2, rd) 
  
  df_f <- df_s %>% 
    as.data.frame() %>%
    summarise_if(is.numeric, sum)
  }

我想复制这 10000 个并将摘要统计数据保存在新的数据框中。

reps <- 10
df_sums <- plyr::rdply(reps, sampling(df))

但是,单独运行此代码 100 次似乎效率非常低,使用我的原始数据集需要稍长的时间。

microbenchmark(sampling(df), times = 100)

有什么建议可以让我更有效地运行我的代码 10000 次吗?我尝试使用

replicate
编写函数,但无法让输出看起来像使用
rdply
那样整洁。

r plyr sample boot microbenchmark
1个回答
0
投票

我认为您不需要对单列重新采样,但可以立即对整个数据帧重新采样。

sampling2 <- function(df) {
  colSums(df[sample(nrow(df), replace=T), ])
}
df_sums <- t(replicate(100, sampling2(df)))

这工作得更快:

microbenchmark(sampling(df),
               sampling2(df))
# Unit: milliseconds
#          expr       min        lq      mean    median        uq      max neval cld
#  sampling(df) 62.047601 64.451151 77.350142 69.629501 81.000350 476.3357   100   b
# sampling2(df)  1.427401  1.562552  1.954756  1.654052  1.906201  13.3865   100  a 
© www.soinside.com 2019 - 2024. All rights reserved.