web-dev-qa-db-ja.com

purrr :: pmapを使用してnested.data.frameに複数のggplotをプロットする方法

Nested.data.frameにggplotの複数のプロットを作成するためのpurrr :: pmapについていくつか質問があります。

Purrr :: map2を使用すると、以下のコードを問題なく実行でき、nested.data.frameでmultiplots(2プロット)を作成できます。

例として、Rのアイリスデータセットを使用しました。

library(tidyverse)

iris0 <- iris
iris0 <-
iris0 %>%  
group_by(Species) %>%  
nest() %>%  
mutate(gg1 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Sepal.Width)) + geom_point())) %>%
mutate(gg2 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Width)) + geom_point())) %>%
mutate(g = purrr::map2(gg1, gg2, ~ gridExtra::grid.arrange(.x, .y)))

しかし、3つ以上のプロットをプロットしたい場合、以下のコードのようにpurrr :: pmapを使用して解決することはできません。

iris0 <-  
iris0 %>%  
group_by(Species) %>%  
nest() %>%  
mutate(gg1 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Sepal.Width)) + geom_point())) %>%
mutate(gg2 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Width)) + geom_point())) %>%
mutate(gg3 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Length)) + geom_point())) %>%
mutate(g = purrr::pmap(gg1, gg2,gg3, ~ gridExtra::grid.arrange(.x, .y, .z)))

> Error in mutate_impl(.data, dots) : Index 1 is not a length 1 vector

この問題をnested.data.frameで解決する方法はありますか?アドバイスや回答をお願いします。

15
Lc_decg

purrr::pmapは(少なくとも)2つの引数を取ります:

 pmap(.l, .f, ...)

どこ

  .l: A list of lists. The length of '.l' determines the number of
      arguments that '.f' will be called with. List names will be
      used if present.
  .f: A function, formula, or atomic vector.

さらに、 .xおよび.yは2つの引数に対してのみ適切に機能しますが、(同じマニュアルページで)For more arguments, use '..1', '..2', '..3' etc

読みやすさ(そして少し効率的)のために、mutateへの個々の呼び出しをすべて1つにまとめます。必要に応じて、それらを別々に保つことができます(特に、この縮小された例で示すよりも多くのコードがある場合):

library(dplyr)
library(tidyr)
library(purrr)
library(ggplot2)
iris0 <- iris %>%  
  group_by(Species) %>%  
  nest() %>%  
  mutate(
    gg1 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Sepal.Width)) + geom_point()),
    gg2 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Width)) + geom_point()),
    gg3 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Length)) + geom_point()),
    g = purrr::pmap(list(gg1, gg2, gg3), ~ gridExtra::grid.arrange(..1, ..2, ..3))
  )
18
r2evans