我目前正在学习 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)
}
Run Code Online (Sandbox Code Playgroud)
我试过这个:
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)
})
Run Code Online (Sandbox Code Playgroud)
代码示例取自给定父母身高的孩子的高尔顿身高。您可以在 UsingR 包中获取这些数据。这样你就得到了高尔顿。但实际上它可以是任何东西。只是一些常规的数据框。
但是当它正确执行时,sampleLm
向量没有更新并且包含所有None
. 我觉得这是正常的,因为我从 R 文档中找到了“无副作用”规则。
必须有一种方法来重新表述它,所以for
被替换为apply
. 问题是如何?
这里最简单的方法是replicate
:
sampleLm <- replicate(100, lm(child ~ parent, data = galton,
subset = sample(seq(nrow(galton)), size = 50)),
simplify = FALSE)
Run Code Online (Sandbox Code Playgroud)