R - 基于嵌套列表的标题图

时间:2012-05-16 20:53:44

标签: r list nested-lists

我有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")

在两个主要列表alphabravo中,我们还有两个列表charliedelta

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

我可以使用lapply遍历每个列表并绘制数据框,但我无法将标题合并到主列表的名称(alphabravo )和每个数据框的嵌套列表(charliedelta)。例如,在这种情况下,我希望有四个图表:alpha_charliealpha_deltabravo_charliebravo_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!
    } ) } )

非常感谢任何帮助。谢谢!

3 个答案:

答案 0 :(得分:4)

您可以在索引序列上使用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 = "_"))
        })})

答案 1 :(得分:3)

我倾向于在这种情况下坚持使用for循环。这样做可以轻松地将图表保存到新列表中,然后使用grid.arrangedo.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()

enter image description here

答案 2 :(得分: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)