1

私は現在Rを学んでおり、forループをapplyを使用するように変更しようとしました。コンテキストは、親 (インチ単位の高さ) と子 (インチ単位の高さ) の 2 つの変数を持つデータフレーム ガルトンです。これから繰り返しサンプリングし、(lm を使用して) 線形モデルを取得し、その結果をベクトルに保存したいと考えています。

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です。問題はどのようにですか?

4

2 に答える 2

5

ここで最も簡単な方法は次のreplicateとおりです。

sampleLm <- replicate(100, lm(child ~ parent, data = galton, 
                              subset = sample(seq(nrow(galton)), size = 50)), 
                      simplify = FALSE)
于 2013-02-25T16:35:01.537 に答える
2

*apply ファミリを使用する場合、sampleLm を事前に割り当てる必要はありません。実行したい関数を記述して、目的の結果を返し、最終結果を変数に格納するだけです。

sampleLm <- sapply(samples, function(x) {
    sampleGalton <- galton[sample(1:length(galton$child),size=50,replace=F),]
    lm(sampleGalton$child ~ sampleGalton$parent)
})
于 2013-02-25T16:28:52.140 に答える