r - 将一个 dplyr "do"函数的结果传递给另一个函数

标签 r dplyr do.call

我正在尝试按组运行回归,然后将回归模型对象传递给另一个函数。

library("lmtest")
library("broom")
library("tidyr")
library("dplyr")
library("purrr")

  fitted_models <-  mtcars %>% 
    group_by(gear) %>% 
    do(fit = lm(mpg ~ ., data = .),
       test = coeftest(fit)) # from lmtest library

我得到错误:

Error in coeftest(fit) : object 'fit' not found

有没有一种方法可以传递变量,以便我可以在每个 do 文件中运行 1 个以上的函数,从而使我的数据框具有 gear、fit 和 test 作为其列?

最佳答案

我们可以使用{}来分隔do中的多条语句,用tidy包装coeftest输出(来自 broom)将相关列提取到 tibble 输出

res <- mtcars %>% 
         group_by(gear) %>% 
         do({fit = lm(mpg ~ ., data = .)
         tidy(coeftest(fit))
         })
res
# A tibble: 24 x 6
# Groups: gear [3]
#    gear term        estimate std.error statistic p.value
#   <dbl> <chr>          <dbl>     <dbl>     <dbl>   <dbl>
# 1  3.00 (Intercept) -11.9      43.4       -0.273  0.794 
# 2  3.00 cyl         - 0.282     2.04      -0.138  0.895 
# 3  3.00 disp        - 0.0186    0.0190    -0.981  0.364 
# 4  3.00 hp            0.142     0.0779     1.83   0.117 
# 5  3.00 drat          0.998     3.87       0.258  0.805 
# 6  3.00 wt            0.684     2.63       0.260  0.804 
# 7  3.00 qsec          1.33      1.63       0.816  0.445 
# 8  3.00 vs          - 2.42      4.58      -0.527  0.617 
# 9  3.00 carb        - 6.66      2.72      -2.45   0.0499
#10  4.00 (Intercept)  26.7     185          0.144  0.899 

如果我们需要将其保留为一列,则用 list

包装
 fitted_models <-  mtcars %>% 
                     group_by(gear) %>% 
                     do({fit = lm(mpg ~ ., data = .)
                     data_frame(test = list(coeftest(fit)), fit = list(fit)) %>%
                     select(fit, test)}
  )

fitted_models
# A tibble: 3 x 3
# Groups: gear [3]
#   gear fit      test          
#  <dbl> <list>   <list>        
#1  3.00 <S3: lm> <S3: coeftest>
#2  4.00 <S3: lm> <S3: coeftest>
#3  5.00 <S3: lm> <S3: coeftest>

我们可以用$[[

提取list
fitted_models$test

或者另一个选项是 purrr

中的 map
mtcars %>% 
   split(.$gear) %>%
   map(~ lm(mpg ~ ., data = .x)  %>%
               coeftest %>% 
               tidy) %>%
   bind_rows(, .id = 'gear')

或者如果我们需要用 map

创建一个列
mtcars %>%
     nest(-gear) %>% 
     mutate(test = map(data, ~ lm(mpg ~ ., data = .x) %>% 
                             coeftest %>% 
                             tidy)) %>%
                             as_tibble %>%
     select(-data)
# A tibble: 3 x 2
#    gear test                 
#    <dbl> <list>               
#1  4.00 <data.frame [10 x 5]>
#2  3.00 <data.frame [9 x 5]> 
#3  5.00 <data.frame [5 x 5]> 

如果我们需要 'fit' 和 'test' 作为列

mtcars %>% 
  nest(-gear) %>%
  mutate(fit = map(data, ~ lm(mpg ~ ., data = .x)),
         test = map(fit, ~coeftest(.x))) %>%
  as_tibble
# A tibble: 3 x 4
#      gear  data                   fit      test          
#   <dbl> <list>                 <list>   <list>        
#1  4.00 <data.frame [12 x 10]> <S3: lm> <S3: coeftest>
#2  3.00 <data.frame [15 x 10]> <S3: lm> <S3: coeftest>
#3  5.00 <data.frame [5 x 10]>  <S3: lm> <S3: coeftest>

关于r - 将一个 dplyr "do"函数的结果传递给另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49049821/

相关文章:

r - echarts4r 创建数据透视图(子组 x 轴)

r - 使用R Shiny框架的密码字段

r - Dplyr - 选择一列是否存在,如果存在则汇总

R 使用 do.call、lapply 或 mapply 从向量列表中进行子选择?

regex - 从R中的单个字符串中提取所有数字

Rselenium - 如何抓取所有下拉列表选项值

r - 如何使用一行前后的数据为每一行创建子数据框

RSelenium:从 Google 搜索中单击 for 循环中的后续链接

r - 在 ggplots 列表上调用 grid.arrange

r - 提取 data.table 的片段