2012-05-16 1 views
3

2 개의 목록이 있으며 각각의 내부에는 데이터 프레임을 포함하는 2 개의 목록 (즉 중첩 목록)이 있습니다. 기본 및 중첩 목록의 이름을 기반으로 각 데이터 프레임과 제목을 그려야합니다. 우리가 두 개 더 목록이,중첩 목록을 기반으로 한 R 제목 플롯

names(a)=c("alpha","bravo") 
두 차 목록 alpha 내부

bravo : 예를 들어

, 우리는이 말 :

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)))) 

그리고 우리는 기본 목록의 이름이 charliedelta :

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

lapply을 사용하여 각 목록을 반복하고 데이터 프레임을 플로팅 할 수 있지만 각 데이터 프레임에 기본 목록 (alphabravo)과 중첩 목록 (및 delta)의 이름을 결합하는 데 문제가 있습니다. . 예를 들어이 경우 alpha_charlie, alpha_delta, bravo_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

이름 자체 대신 색인 순서에 lapply를 사용할 수 있습니다.

+0

잘 작동합니다. 나는 for 루프와 비슷한 것을하려고했지만 분리되었다. 비슷한 접근법. 감사! – jslefche

2

첫 번째 회화에서는 이름을 잃어 버렸기 때문에 이것은 어색해졌습니다. Dason은 당신에게 좋은 해결책을주었습니다.

그러나 데이터 목록의 목록을 단일 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.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