как нарезать данные в функции lapply - PullRequest
6 голосов
/ 23 мая 2019

Я хочу расположить N ggplot (каждый граненый) на сетке с grid.arrange.

library(tidyverse)
library(ggplot2)
library(gridExtra)


plots <- lapply(unique(mtcars$cyl), function(cyl) {
    data <- mtcars %>% filter(cyl == cyl)
    ggplot(data, aes(x=mpg, y=hp))+
        geom_point(color = "blue")+
        facet_wrap(.~carb)}) %>% 
    do.call(grid.arrange, .)
do.call(grid.arrange, plots )

Проблема в том, что все графики основаны на всем наборе данных, и они отображают один и тот же график, в то время как они должны отличаться, поскольку я фильтрую их в строке

data <- mtcars %>% filter(cyl == cyl).

Ответы [ 3 ]

6 голосов
/ 23 мая 2019

filter имеет дело с cyl слишком буквально и рассматривается как строка, поэтому cyl==cyl ИСТИНА для всего набора данных. Вы можете решить эту проблему, сняв кавычку цил, используя !!, или используйте другое имя переменной в функции, например, x.

#Option 1
data <- mtcars %>% filter(cyl == !!cyl)
#Option 2
... function(x) {
    data <- mtcars %>% filter(cyl == x)
...
4 голосов
/ 23 мая 2019

Вот подход tidyverse

library(tidyverse)

group_plots <- mtcars %>%
                 group_split(cyl) %>%
                 map(~ggplot(., aes(x = mpg, y = hp))+
                 geom_point(color = "blue") +
                 facet_wrap(.~carb))

do.call(gridExtra::grid.arrange, group_plots)

enter image description here

3 голосов
/ 23 мая 2019

Попробуйте использовать split() сначала:

library(tidyverse)
library(gridExtra)

l <- split(mtcars, mtcars$cyl) # divide based on cyl in a list

plots <- lapply(l, function(x) {
  ggplot(x, aes(x=mpg, y=hp)) +
    geom_point(color = "blue") +
    facet_wrap(.~carb)
}) # call lapply() on each element

do.call(grid.arrange, plots)  

enter image description here

...