【问题标题】:Loop through function and stack the output into a dataset in R循环遍历函数并将输出堆叠到 R 中的数据集中
【发布时间】:2021-06-03 10:12:47
【问题描述】:

我编写了一个运行线性模型并输出数据框的函数。我想多次运行该函数并堆叠输出。这是一个假设的数据集和函数:

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
  }

目前,我对数据集中的每个年级运行该函数:

grade1 = func(1)
grade2 = func(2)
grade3 = func(3)
grade4 = func(4)

pred.values = rbind(grade1, grade2, grade3, grade4)

如何使用循环(或其他方法)更有效地多次运行此函数?

【问题讨论】:

    标签: r function loops dplyr


    【解决方案1】:

    purrr 包有一个非常方便的功能。 map 的工作方式类似于 Base R 中的 apply 系列函数(在许多方面都类似于 for 循环)。 _dfr 指定您要在返回之前对结果调用 rbind

    这个函数说:“循环通过c(1, 2, 3, 4),每次调用func(),然后rbind最后的结果并将data.frame返回给我。”

    purrr::map_dfr(1:4, func)
    

    【讨论】:

    • 当你发布你的答案时,实际上是在输入相同的答案。你是一个快速打字员
    • @AdamK 支持我。一个班轮,而不是写一个循环。
    【解决方案2】:

    请使用下面的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
    

    【讨论】:

      【解决方案3】:

      使用lapply()的解决方案

       do.call("rbind", lapply(1:4, func))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-02
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        • 2017-12-14
        相关资源
        最近更新 更多