将一个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
或者另一种选择是来自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]>
如果我们需要'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”函数的结果传递给另一个函数的主要内容,如果未能解决你的问题,请参考以下文章