如何在lapply函数中切片数据

时间:2019-05-23 07:28:15

标签: r ggplot2 dplyr lapply

我想在带有grid.arrange的网格上排列N个ggplot(每个面都是多面的)。

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 个答案:

答案 0 :(得分:6)

filter处理cyl过于字母化并且被视为字符串,因此cyl==cyl对于整个数据集为TRUE。您可以通过使用!!取消对cyl的引用或在函数中使用另一个变量名来解决此问题,例如x

#Option 1
data <- mtcars %>% filter(cyl == !!cyl)
#Option 2
... function(x) {
    data <- mtcars %>% filter(cyl == x)
...

答案 1 :(得分:4)

这是一种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

答案 2 :(得分:3)

首先尝试使用try

split()

enter image description here