可能最简单的方法是使用 dplyr::do()
函数,但也可以使用 group_modify()
。完整示例:
library(tidyverse)
func = function(x) {
mod = lm(Sepal.Length ~ Petal.Width, data = x)
mod_coefs = broom::tidy(mod)
tibble(
mean_sepal_length = mean(x$Sepal.Length),
mean_petal_width = mean(x$Petal.Width),
slope = mod_coefs[[2, 2]],
slope_p = mod_coefs[[2, 5]]
)
}
plyr::ddply(iris, "Species", func)
iris %>%
group_by(Species) %>%
do(func(.))
func2 = function(x, y) {
mod = lm(Sepal.Length ~ Petal.Width, data = x)
mod_coefs = broom::tidy(mod)
tibble(
mean_sepal_length = mean(x$Sepal.Length),
mean_petal_width = mean(x$Petal.Width),
slope = mod_coefs[[2, 2]],
slope_p = mod_coefs[[2, 5]]
)
}
iris %>%
group_by(Species) %>%
group_modify(func2)
这些会产生以下结果:
Species mean_sepal_length mean_petal_width slope slope_p
1 setosa 5.006 0.246 0.9301727 5.052644e-02
2 versicolor 5.936 1.326 1.4263647 4.035422e-05
3 virginica 6.588 2.026 0.6508306 4.798149e-02
Species mean_sepal_length mean_petal_width slope slope_p
<fct> <dbl> <dbl> <dbl> <dbl>
1 setosa 5.01 0.246 0.930 0.0505
2 versicolor 5.94 1.33 1.43 0.0000404
3 virginica 6.59 2.03 0.651 0.0480
Species mean_sepal_length mean_petal_width slope slope_p
<fct> <dbl> <dbl> <dbl> <dbl>
1 setosa 5.01 0.246 0.930 0.0505
2 versicolor 5.94 1.33 1.43 0.0000404
3 virginica 6.59 2.03 0.651 0.0480
有2个区别。
ddply()
的输出是标准数据框架,即使函数输出了tibble也是如此。
dplyr 的输出是分组的tibbles,尽管已经使用了分组。
group_by_map
尝试覆盖这种情况。 - jorangroup_map
,您可以在 此处 阅读相关内容。在 dplyr 中执行这种操作的旧方法(我认为仍然有效)是使用do()
。 - joran