[英]Nested loop through function with multiple arguments and stack the output
[英]Loop through function and stack the output into a dataset in R
我写了一个运行线性 model 并输出数据帧的 function。 我想多次运行 function 并堆叠 output。 这是一个假设的数据集和 function:
data = data.frame(grade_level = rep(1:4, each = 3),
x = rnorm(12, mean = 21, sd = 7.5),
y = rnorm(12, mean = 20, sd = 7))
func = function(grade){
model = lm(y ~ x, data=data[data$grade_level == grade,])
fitted.values = model$fitted.values
final = data.frame(grade_level = data$grade_level[data$grade_level == grade],
predicted_values = fitted.values)
final
}
目前,我对数据集中的每个年级运行 function:
grade1 = func(1)
grade2 = func(2)
grade3 = func(3)
grade4 = func(4)
pred.values = rbind(grade1, grade2, grade3, grade4)
如何使用循环(或其他)更有效地多次运行此 function?
purrr
package 为此提供了一个非常方便的 function。 map
的工作方式类似于 Base R 中的apply
系列函数(在许多方面都像for
循环一样运行)。 _dfr
指定您要在返回之前对结果调用rbind
。
这个data.frame
说:“循环遍历c(1, 2, 3, 4)
,每次调用func()
,然后在最后rbind
将结果返回给我。”
purrr::map_dfr(1:4, func)
请在下面使用循环和rbind
找到解决方案。
data = data.frame(grade_level = rep(1:4, each = 3),
x = rnorm(12, mean = 21, sd = 7.5),
y = rnorm(12, mean = 20, sd = 7))
func = function(grade){
model = lm(y ~ x, data=data[data$grade_level == grade,])
fitted.values = model$fitted.values
final = data.frame(grade_level = data$grade_level[data$grade_level == grade],
predicted_values = fitted.values)
return(final)
}
grades <- c(1:4)
pred.values <- data.frame()
for (i in grades) {
temp <- func(grade = i)
pred.values <- rbind(pred.values, temp)
}
会给
> pred.values
grade_level predicted_values
1 1 30.78802
2 1 22.79665
3 1 29.56155
4 2 14.60050
5 2 14.56934
6 2 14.71737
7 3 16.97698
8 3 17.71697
9 3 18.95596
10 4 15.18937
11 4 16.56399
12 4 22.49093
使用lapply()
的解决方案
do.call("rbind", lapply(1:4, func))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.