我目前正在学习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
。问题是如何?
什么是'samples'?请使您的代码具有可重现性。 – 2013-02-25 16:26:33
为什么你会期望第二个版本修改sampleLm?我没有看到任何会导致sapply语句修改sampleLm的内容。 – Dason 2013-02-25 16:27:12
与'apply'系列函数不同,您不需要创建输出变量并像在for循环中那样填充它。相反,将'sapply'的输出分配给它:'sampleLm < - sapply(...)'。 – Justin 2013-02-25 16:27:59