将一个dplyr“do”函数的结果传递给另一个函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将一个dplyr“do”函数的结果传递给另一个函数相关的知识,希望对你有一定的参考价值。

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

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文件运行多个函数,以便我的数据框具有齿轮,适合和测试作为其列?

答案

我们可以使用{}来分隔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

或者另一种选择是来自mappurrr

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>

以上是关于将一个dplyr“do”函数的结果传递给另一个函数的主要内容,如果未能解决你的问题,请参考以下文章

C ++编译器能否优化使用用于将函数结果传递给另一个函数的虚拟变量?

Llvm C++ API 将指向函数的指针传递给另一个函数

JavaScript 将作用域传递给另一个函数

将多个值传递给另一个函数内的函数

将一个函数中创建的 PHP 变量传递给另一个函数

将变量传递给另一个页面上的函数