重新设计for循环以在R中使用apply

时间:2013-02-25 16:22:56

标签: r for-loop apply

我正在学习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。问题是如何?

2 个答案:

答案 0 :(得分:4)

最简单的方法是replicate

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

答案 1 :(得分:2)

使用* apply系列时,您不需要预先分配sampleLm。您只需要编写要运行的函数,以便它转换感兴趣的结果,然后将最终结果存储在变量中。

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