我有一个大数据框,我想从中为每一列抽取随机样本。我想多次采样并将结果总和存储在新的数据框中。
我的数据框如下所示:
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
那样整洁。
我认为您不需要对单列重新采样,但可以立即对整个数据帧重新采样。
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