在dplyr :: mutate中重用函数调用的结果

时间:2016-12-14 19:30:56

标签: r dplyr

我使用dplyr::doglm将模型按组拟合到示例数据。我想添加具有置信区间上限和下限的列:如何避免两次调用confint?通常,有没有办法使用dplyr::mutate

将通用输出分配给新列
df <- data.frame(
  x = rep(c("a", "b"), each=10),
  y = c(rpois(10, 0.5), rpois(10, 2.2)))

sdf <- df %>%
  group_by(x) %>%
  do(fit=glm(y ~ 1, poisson, data=.))

mutate(sdf,
  est=coef(fit),
  cil=confint(fit)[1],
  ciu=confint(fit)[2])

简而言之,我希望这一点能够发挥作用:

mutate(sdf, ci=confint(fit)) %>%
  mutate(cil=ci[1], ciu=ci[2])

如果我再次使用do,我会丢失拟合的模型x

解决方案

我实际使用的内容(从接受的答案中学习):

sdf <- df %>%
  group_by(x) %>%
  do({
    fit <- glm(y ~ 1, poisson, data=.)
    ci <- confint(fit)
    data.frame(
      est=coef(fit),
      cil=ci[1],
      ciu=ci[2])
  })

2 个答案:

答案 0 :(得分:2)

正如评论中所述,这是一种使用dplyrpurrrtidyrbroom的方法。

library(purrr)
library(tidyr)
library(dplyr)
library(broom)

sdf <- df %>%
  nest(y) %>%
  mutate(model = map(data, ~glm(y ~ 1, poisson, data = .))) %>% 
  unnest(map(model, tidy))

Source: local data frame [2 x 8]

       x            data        model        term   estimate std.error statistic      p.value
  (fctr)           (chr)        (chr)       (chr)      (dbl)     (dbl)     (dbl)        (dbl)
1      a <tbl_df [10,1]> <S3:glm, lm> (Intercept) -0.5108256 0.4082458 -1.251270 2.108361e-01
2      b <tbl_df [10,1]> <S3:glm, lm> (Intercept)  1.0296194 0.1889795  5.448311 5.085025e-08

我会通过Google阅读更多关于purrrtidyrbroom的信息,以及包装内容网页。 RStudio Blog about tidyverse packages上还有很多有用的信息。

答案 1 :(得分:1)

所有上述评论都是很好的新软件包,可以帮助解决您的问题(我强烈推荐purrr),但如果您想坚持使用do,您可以像这样重新格式化,这样您就可以了每组调用一次confint

sdf <- df %>%
    group_by(x) %>%
    do({fit <- glm(y ~ 1, poisson, data=.);
        data.frame(confint(fit), coef(fit))})

输出需要一些工作才能进入可绘制的格式:

sdf %>% mutate(ci = rep(c("low", "high"), legnth.out = nrow(.))) %>% spread(ci, confint.fit.)