使用 dplyr 和 do 构建和使用模型
Use dplyr and do to build and use models
我正在使用 dplyr 构建 table 个模型
library(dplyr)
t1 <- iris %>%
group_by(Species) %>%
do(model = lm(formula = Petal.Width ~ Petal.Length, data = .))
我知道如何将这些模型输入到后续函数中,例如:
t2 <- t1 %>%
do(summ = .$model %>% summary)
我希望将两个输出合并为一个 table 而不会丢失 dplyr 'format'
这两种解决方案都将列表扩展为文本,我不希望这样:
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 列?
下面会给你预期的结果。在创建 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>
我不知道这是不是一个错误。根据 dplyr 在使用 mutate
或 summarize
时的行为,我希望原始分组信息被保留或省略。因此,上面的数据框应该显示 Species
而不是 <by row>
或根本没有分组信息。也许有人可以对此发表评论。
我正在使用 dplyr 构建 table 个模型
library(dplyr)
t1 <- iris %>%
group_by(Species) %>%
do(model = lm(formula = Petal.Width ~ Petal.Length, data = .))
我知道如何将这些模型输入到后续函数中,例如:
t2 <- t1 %>%
do(summ = .$model %>% summary)
我希望将两个输出合并为一个 table 而不会丢失 dplyr 'format'
这两种解决方案都将列表扩展为文本,我不希望这样:
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 列?
下面会给你预期的结果。在创建 t2 的第二个管道链中,我添加了 ungroup %>% group_by(Species)
。这是必要的,以便在调用 inner_join
.
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>
我不知道这是不是一个错误。根据 dplyr 在使用 mutate
或 summarize
时的行为,我希望原始分组信息被保留或省略。因此,上面的数据框应该显示 Species
而不是 <by row>
或根本没有分组信息。也许有人可以对此发表评论。