2012-10-28 43 views
0

可能重複:
Bootstrap a large data set引導雙向大型數據集

我想引導它包含多個列和行變量的大型雙向數據集。我必須保留行和列變量。結果應該是包含每個行變量的所有列變量的引導的列表。我提供了所需的代碼來回答我的問題,但我認爲這不是優雅。我將不勝感激一個更好,更快的代碼。以下是雙向數據集的簡化再創造:

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 
+0

在你的最後一個循環,它看起來像'k'每次迭代被覆蓋,所以只得到'對'i == numBoots' k'。這是打算嗎? – flodel

回答

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) 
+1

謝謝,幹得好,這回答了我的問題。 –

+0

非常感謝你,重寫是完美的。我希望我能給你更多的觀點,但系統不允許我這樣做。 –