【问题标题】:R - title plots based on nested listsR - 基于嵌套列表的标题图
【发布时间】:2012-05-24 11:42:01
【问题描述】:

我有 2 个列表,每个列表中还有两个包含数据框的列表(换句话说,嵌套列表)。我想根据主列表和嵌套列表的名称绘制每个数据框并为其命名。

例如,假设我们有:

a=list(
  list(a=data.frame(x=rpois(5,1),y=rpois(5,1)),
       b=data.frame(x=rpois(5,1),y=rpois(5,1))),
  list(c=data.frame(x=rpois(5,1),y=rpois(5,1)),
       d=data.frame(x=rpois(5,1),y=rpois(5,1))))

我们有主要列表的名称:

names(a)=c("alpha","bravo")

在两个主要列表alpha 和bravo 中,我们还有两个列表charlie 和delta:

for(i in 1:length(a)) {
  names(a[[i]])=c("charlie","delta") }

我可以使用lapply 循环遍历每个列表并绘制数据框,但是我无法让标题将主列表的名称(alpha 和 bravo)和嵌套列表( charlie 和 delta) 用于每个数据帧。例如,在这种情况下,我希望有四个图名为:alpha_charlie、alpha_delta、bravo_charlie 和 bravo_delta。

lapply(a,function(i) {
  lapply(names(i), function(j) { 
    ggplot()+
      geom_point(data=i[[j]],aes(x,y))+
      opts(title=paste(names(i),j,sep="_")) #Here is where I am struggling!
    } ) } )

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: r list nested-lists


    【解决方案1】:

    您可以在索引序列上使用 lapply 而不是名称本身。

    lapply(seq(a), function(i){
        lapply(seq(a[[i]]), function(j){
            ggplot() +
            geom_point(data = a[[i]][[j]], aes(x, y))+
            opts(title = paste(names(a)[i], names(a[[i]])[j], sep = "_"))
            })})
    

    【讨论】:

    • 效果很好。我试图用 for 循环做类似的事情,但它崩溃了......类似的方法。谢谢!
    【解决方案2】:

    在您的第一次应用中,您已经丢失了名称,所以这最终很糟糕。 Dason 给了你一个很好的解决方案。

    但是,我认为将 data.frames 列表转换为单个 data.frame 会更好!并使用刻面!

    nested.fun <- function(l) {
      out <- ldply(l, data.frame)
      names(out)[1] <- 'inner.id'
      return(out)
    }
    
    one.df <- ldply(a, nested.fun)
    
    ggplot(one.df, aes(x,y))+geom_point()+facet_grid(.id~inner.id)
    

    【讨论】:

      【解决方案3】:

      我的偏好是在这种情况下坚持使用for 循环。这样做可以很容易地将绘图保存到一个新列表中,然后使用grid.arrange 和do.call 一次打印它们。

      library(ggplot2)
      
      plot_list = list() # Save plots to list.
      
      for (name_1 in names(a)) {
          for (name_2 in names(a[[name_1]])) {
              title_string = paste(name_1, name_2, sep="_")
      
              plt = ggplot(data=a[[name_1]][[name_2]], aes(x=x, y=y)) +
                    geom_point() +
                    opts(title=title_string)
      
              plot_list[[title_string]] = plt
          }
      }
      
      library(gridExtra)
      png("plots.png", height=600, width=600)
      do.call(grid.arrange,  plot_list)
      dev.off()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多