3

2つのリストがあり、それぞれの中にデータフレームを含む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")

2つのプライマリリストalphaとの中に、bravoさらに2つのリストがcharlieありdeltaます。

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

lapply各リストをループしてデータフレームをプロットするために使用できますが、タイトルを取得して、各データフレームのプライマリリスト(alphabravo)とネストされたリスト(charlieと)の名前を組み合わせるのに問題がありdeltaます。たとえば、この場合、、、、、およびと呼ばれる4つのプロットが必要alpha_charlieです。alpha_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!
    } ) } )

どんな助けでも大歓迎です。ありがとうございました!

4

3 に答える 3

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 = "_"))
        })})
于 2012-05-16T21:10:16.170 に答える
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()

ここに画像の説明を入力

于 2012-05-16T21:48:35.853 に答える
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)
于 2012-05-16T21:30:46.570 に答える