【问题标题】:(R) Cleaner way to use map() with list-columns(R) 更简洁地使用带有列表列的 map()
【发布时间】: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 日创建

【问题讨论】:

  • 您实际上不需要rowwisepurrr 函数。尝试iris %&gt;% group_by(Species) %&gt;% summarise(mean_slpength = mean(Sepal.Length), mean_swidth = mean(Sepal.Width)) 给出相同的输出。
  • @RonakShah 这是一个淡化的例子。我真正的问题涉及进入列表列中包含的小标题并应用函数,所以不幸的是你的解决方案对我不起作用:(。谢谢!
  • 真的太多了。您觉得rowwise() 解决方案在哪些方面更干净?我可以看到必须为每一列指定map_dbl 可能会变老。我认为对map_* 的偏好部分归因于它的明确性:您无需跟踪管道即可找到rowwise() 以了解正在发生的事情。 (尽管你可以对group_by() 提出同样的看法。)
  • map() 函数也很清楚,哪些 列您正在迭代其元素,并且您可以混合列进行迭代和列不进行迭代。但是,如果您对rowwise() 感到满意并且它没有给您带来任何问题,我不会为此而自责。在不知道您真正想用它做什么的情况下,很难提供更明确的指导。

标签: r tidyverse


【解决方案1】:

不要使用两个map,而是使用一个summarise_at

library(tidyverse)
iris %>% 
   group_by(Species) %>% 
   nest() %>% 
   mutate(out = map(data, ~ 
               .x  %>% 
                 summarise_at(vars(matches('Sepal')), 
              funs(mean_s = mean(., na.rm = TRUE))))) %>% 
   unnest(out)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2011-12-02
    相关资源
    最近更新 更多