2013-02-25 61 views
1

我目前正在學習R,並且我試圖改變for循環來使用apply。 上下文是一個帶有2個變量的父框架(以英寸爲單位)和子框架(以英寸爲單位)的數據框浮雕。我想從中反覆取樣並獲得線性模型(使用lm)並將結果保存到向量中。重新設計一個for循環使用適用於R

library(UsingR) 
sampleLm <- vector(100,mode="list") 
for(i in 1:100) { 
    sampleGalton <- galton[sample(1:length(galton$child),size=50,replace=F),] 
    sampleLm[[i]] <- lm(sampleGalton$child ~ sampleGalton$parent) 
} 

我嘗試這樣做:

sampleLm <- vector(100,mode="list") 
sapply(samples, function(x) { 
    sampleGalton <- galton[sample(1:length(galton$child),size=50,replace=F),] 
    x <- lm(sampleGalton$child ~ sampleGalton$parent) 
}) 

樣品是從父母給孩子高度的高爾頓高度所採取的代碼。 你可以在UsingR包中獲取這些數據。這樣你會得到遊戲。但真的可能是任何事情。只是一些常規的數據框。

但雖然它正確執行,sampleLm矢量未更新,並且包含所有None。我覺得這是正常的,因爲我從R文檔中找到了「無副作用」規則。

必須有一種方法來重新表達這個,所以for被替換爲apply。問題是如何?

+0

什麼是'samples'?請使您的代碼具有可重現性。 – 2013-02-25 16:26:33

+0

爲什麼你會期望第二個版本修改sampleLm?我沒有看到任何會導致sapply語句修改sampleLm的內容。 – Dason 2013-02-25 16:27:12

+0

與'apply'系列函數不同,您不需要創建輸出變量並像在for循環中那樣填充它。相反,將'sapply'的輸出分配給它:'sampleLm < - sapply(...)'。 – Justin 2013-02-25 16:27:59

回答

4

最簡單的方法在這裏是replicate

sampleLm <- replicate(100, lm(child ~ parent, data = galton, 
           subset = sample(seq(nrow(galton)), size = 50)), 
         simplify = FALSE) 
+0

非常感謝斯文!這正是我所希望的那種答案。 – 2013-03-01 23:57:07

2

使用* apply系列時,不需要預先分配sampleLm。你只需要編寫你想要運行的函數,這樣它就可以轉化感興趣的結果,然後將最終結果存儲在一個變量中。

sampleLm <- sapply(samples, function(x) { 
    sampleGalton <- galton[sample(1:length(galton$child),size=50,replace=F),] 
    lm(sampleGalton$child ~ sampleGalton$parent) 
})