使用现有列表

时间:2017-09-20 01:12:22

标签: r list ggplot2

我想创建一个包含图表的命名列表。我从包含唯一ID的向量创建一个列表,用于过滤包含所有信息的主数据帧。

然后我有一个函数,我在lapply中使用循环遍历唯一ID列表来过滤主数据帧并创建绘图。然后我想将每个绘图附加到(最初)初始化列表中,并且我希望列表条目的名称等于lapply中传递的列表值。

下面的代码创建了绘图,但是附加的列表没有传递的列表ID值的相应名称。

我的做法是否错误?我已经看到使用名称(列表)等的问题/答案但是传递给lapply的列表没有命名,我希望传递列表条目成为新列表的名称。

提前致谢!

library(ggplot2)
library(dplyr)

unique_names = as.list(c("apple", "banana", "carrots"))
listy = list()
dframe = data.frame(x_var = seq(1:9)) %>% 
  mutate(y_var = x_var^3)
temp = data.frame(id = c("apple", "apple", "apple", "banana", "banana", "banana", "carrots", "carrots", "carrots"))
dframe = bind_cols(dframe,
                   temp)

fun_plots = function(my_list,
                     my_df,
                     my_appending_list) {
  a = filter(my_df,
             id == my_list)
  plt = ggplot() +
    geom_line(data = a,
              aes(x = x_var,
                  y = y_var))

  my_appending_list$my_list = plt
}

plot_list = lapply(unique_names,
                   fun_plots,
                   my_df = dframe,
                   my_appending_list = listy)

3 个答案:

答案 0 :(得分:2)

你可以避免编写一个函数并用更多dplyr魔法来改变列表。如果我理解正确,你需要为“id”变量的每个值设置一个单独的绘图对象 - 如果是这样,你可以对“id”执行group_by,然后为每个集合生成一个ggplot对象。这是

的方式
plot_df <- dframe %>% 
  group_by(id) %>% 
  do(plot = ggplot(.data) + geom_line(aes(x = x_var, y = y_var)) + ggtitle(.data$id))
plot_df
#> Source: local data frame [3 x 2]
#> Groups: <by row>
#> 
#> # A tibble: 3 x 2
#>        id     plot
#> *  <fctr>   <list>
#> 1   apple <S3: gg>
#> 2  banana <S3: gg>
#> 3 carrots <S3: gg>

你可以在id变量上面对一个ggplot2。例如:

ggplot(dframe) + geom_line(aes(x = x_var, y = y_var)) + facet_wrap(~ id)

答案 1 :(得分:1)

您可以取出my_appending_list参数,因为它目前没有实现任何目标,您不会修改函数中的listy对象。你可以这样做:

fun_plots = function(my_list,
                     my_df) {
    a = filter(my_df,
               id == my_list)
    plt = ggplot() +
        geom_line(data = a,
                  aes(x = x_var,
                      y = y_var))

    plt
}

plot_list = lapply(unique_names,
                   fun_plots,
                   my_df = dframe)
names(plot_list) = unique_names

答案 2 :(得分:0)

您可以使用dplyr group_by来完成此任务:

library(ggplot2)
library(dplyr)

unique_names = as.list(c("apple", "banana", "carrots"))
listy = list()
dframe = data.frame(x_var = seq(1:9)) %>% 
  mutate(y_var = x_var^3)
temp = data.frame(id = c("apple", "apple", "apple", "banana", "banana", "banana", "carrots", "carrots", "carrots"))
dframe = bind_cols(dframe,
                   temp)

dframe <- group_by(dframe, id) %>% do(plots=ggplot(data=.) +
                              aes(x=x_var, y=y_var) + geom_line() + ggtitle(unique(.$id)))

mylist <- as.list(dframe$plots)

mylist

HTH James