繁体   English   中英

循环遍历 function 并将 output 堆叠到 R 中的数据集中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM