0

可能重复:
引导大型数据集

我想引导一个包含多个列和行变量的大型双向数据集。我必须保留行和列变量。结果应该是一个列表,其中包含每个行变量的所有列变量的引导程序。我正在提供所需的代码来回答我的问题,但我认为它并不优雅。我将不胜感激更好更快的代码。以下是对双向数据集的简化重新创建:

rm(list=ls())

data <- 1:72

创建一个双向矩阵数据:

charDataDiff <- matrix(data, nrow=9,ncol=8)
varNames <- c("A", "B", "C","A", "B", "C","A", "B", "C")

向 charDataDiff 矩阵添加一个字符列:

charDataDiff <- cbind(varNames ,data.frame(charDataDiff))

添加列名:

colnames(charDataDiff) <- c("patchId","s380","s390","s400","s410","s420","s430","s440","s450")

使用行变量“patchId”作为标准分隔数据。这将创建三个列表:每个变量一个

idColor <-  c("A", "B", "C")

(patchSpectrum <- lapply(idColor, function(idColor) charDataDiff[charDataDiff$patchId==idColor,]))

创建函数 sampleBoot 对 patchSpectrum 进行采样

sampleBoot <-  function(nbootstrap=2, patch=3){
    return(lapply(1:nbootstrap, function(i)
             {patchSpectrum[[patch]][sample(1:nrow(patchSpectrum[[patch]]),replace=TRUE),]}))}

列表“k”回答了我的问题。但是,我认为我的代码对于大型数据集和大型引导程序来说很慢。我只为三个行变量引导 10 次迭代。感谢更快更优雅的代码。

numBoots <- 10
for (i in 1: numBoots)
        k <- lapply(1:3, function(n)
                    do.call(rbind, lapply(sampleBoot(i, n), function(x) apply(x[-1], 2, median))))
k
4

1 回答 1

4

我可以提供的是对您的代码的干净重写:

  1. 我把长片段分解成适当命名的函数,所以它读起来更好,
  2. 我删除了该varNames列,而是by按照@KenWilliams 在您之前的问题中所建议的那样拆分您的数据,
  3. 我使用了replicate代替lapply
  4. 我摆脱了for我在评论中指出的不必要的循环。

它应该以这种方式运行得更快;如果不是,我建议您尝试对其进行分析。


charDataDiff <- matrix(1:72, nrow = 9, ncol = 8)
colnames(charDataDiff) <- c("s380", "s390", "s400", "s410",
                            "s420", "s430", "s440", "s450")

varNames      <- c("A", "B", "C", "A", "B", "C", "A", "B", "C")
patchSpectrum <- by(charDataDiff, varNames, data.frame)

sampleOne   <- function(x) x[sample(seq_len(nrow(x)), replace = TRUE), ]
sampleBoot  <- function(x, n) replicate(n, sampleOne(x), simplify = FALSE)
applyMedian <- function(l) do.call(rbind, lapply(l, apply, 2, median))

k <- lapply(lapply(patchSpectrum, sampleBoot, n = 10), applyMedian)
于 2012-10-28T15:08:09.233 回答