【发布时间】:2018-12-27 01:13:11
【问题描述】:
我听说 tidyverse 团队正在取消它,因此我正在尝试从列表列中的 rowwise() 移开。但是,我不习惯使用 purrr 函数,所以我觉得必须有更好的方法来执行以下操作:
我创建了一个列表列,其中包含每个物种的 tibble。然后我想进入小标题并取某些变量的平均值。第一种情况是使用map,第二种是我个人觉得更干净的rowwise解决方案。
有没有人知道在这种情况下使用地图的更好方法?
library(tidyverse)
iris %>%
group_by(Species) %>%
nest() %>%
mutate(mean_slength = map_dbl(data, ~mean(.$Sepal.Length, na.rm = TRUE)),
mean_swidth = map_dbl(data, ~mean(.$Sepal.Width, na.rm = TRUE))
)
#> # A tibble: 3 x 4
#> Species data mean_slength mean_swidth
#> <fct> <list> <dbl> <dbl>
#> 1 setosa <tibble [50 x 4]> 5.01 3.43
#> 2 versicolor <tibble [50 x 4]> 5.94 2.77
#> 3 virginica <tibble [50 x 4]> 6.59 2.97
iris %>%
group_by(Species) %>%
nest() %>%
rowwise() %>%
mutate(mean_slength = mean(data$Sepal.Length, na.rm = TRUE),
mean_swidth = mean(data$Sepal.Width, na.rm = TRUE))
#> Source: local data frame [3 x 4]
#> Groups: <by row>
#>
#> # A tibble: 3 x 4
#> Species data mean_slength mean_swidth
#> <fct> <list> <dbl> <dbl>
#> 1 setosa <tibble [50 x 4]> 5.01 3.43
#> 2 versicolor <tibble [50 x 4]> 5.94 2.77
#> 3 virginica <tibble [50 x 4]> 6.59 2.97
由reprex package (v0.2.1) 于 2018 年 12 月 26 日创建
【问题讨论】:
-
您实际上不需要
rowwise或purrr函数。尝试iris %>% group_by(Species) %>% summarise(mean_slpength = mean(Sepal.Length), mean_swidth = mean(Sepal.Width))给出相同的输出。 -
@RonakShah 这是一个淡化的例子。我真正的问题涉及进入列表列中包含的小标题并应用函数,所以不幸的是你的解决方案对我不起作用:(。谢谢!
-
真的太多了。您觉得
rowwise()解决方案在哪些方面更干净?我可以看到必须为每一列指定map_dbl可能会变老。我认为对map_*的偏好部分归因于它的明确性:您无需跟踪管道即可找到rowwise()以了解正在发生的事情。 (尽管你可以对group_by()提出同样的看法。) -
map()函数也很清楚,哪些 列您正在迭代其元素,并且您可以混合列进行迭代和列不进行迭代。但是,如果您对rowwise()感到满意并且它没有给您带来任何问题,我不会为此而自责。在不知道您真正想用它做什么的情况下,很难提供更明确的指导。