通过一个dplyr的结果"做"功能到另一个功能

时间:2018-03-01 12:33:31

标签: 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 个答案:

答案 0 :(得分:7)

我们可以使用{}分隔do中的多个语句,将coeftest输出包裹tidy(来自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

或其他选项map来自purrr

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]> 

如果我们需要两者都适合&#39;和&#39;测试&#39;作为列

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>