使用dplyr和do来构建和使用模型

时间:2015-02-05 16:56:27

标签: r dplyr

我正在使用dplyr建立一个模型表

library(dplyr)

t1 <- iris %>%
  group_by(Species) %>%
  do(model = lm(formula = Petal.Width ~ Petal.Length, data = .))

我知道如何将这些模型提供给后续功能,例如:

t2 <- t1 %>%
  do(summ = .$model %>% summary)

我希望将两个输出加入到一个表中而不会丢失dplyr'格式'

这两个解决方案都将列表扩展为文本,这是我不想要的:

t3i <- merge(t1, t2)
t3ii  <- cbind(t1, t2)

这是我想要的结果的一个例子:

iris %>%
  group_by(Species) %>%
  do(
    model = lm(formula = Petal.Width ~ Petal.Length, data = .),
    summ = .$model %>% summary
     )

但是我需要分别生成t1和t2,然后将它们组合起来 - 不要一步到位。

inner_join是否有效?如果是,我如何在't2'步骤中拉出Species列?

1 个答案:

答案 0 :(得分:0)

以下内容将为您提供预期的结果。在创建t2的第二个管道链中,我添加了ungroup %>% group_by(Species)。为了在调用inner_join时可以使用ID列,这是必要的。

library(dplyr)

t1 <- iris %>%
  group_by(Species) %>%
  do(model = lm(formula = Petal.Width ~ Petal.Length, data = .)) 

t2 <- t1 %>% ungroup %>% group_by(Species) %>%
  do(summ = .$model %>% summary) 

inner_join(t1, t2)

# Source: local data frame [3 x 3]
# Groups: <by row>
# 
#      Species   model                       summ
# 1     setosa <S3:lm> <S3:summaryDefault, table>
# 2 versicolor <S3:lm> <S3:summaryDefault, table>
# 3  virginica <S3:lm> <S3:summaryDefault, table>

虽然这有效,但它是一种丑陋的解决方法。一般问题似乎是do()次调用会导致数据框中原始分组信息被<by row>替换。

t1
# Source: local data frame [3 x 2]
# Groups: <by row>
#   
#      Species   model
# 1     setosa <S3:lm>
# 2 versicolor <S3:lm>
# 3  virginica <S3:lm>

我不知道这是不是一个bug。根据dplyr在使用mutatesummarize时的行为,我希望保留或省略原始分组信息。因此,上述数据框应显示<by row>或根本不显示分组信息,而不是Species。也许有人可以对此发表评论。