1

我目前正在学习 R,并尝试将 for 循环更改为使用 apply。上下文是一个带有 2 个变量的数据框 galton,父级(英寸高)和子级(英寸高)。我想从中重复采样并获得一个线性模型(使用 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 回答