2014-03-07 1 views
2

저는 최근에 lapply와 sapply를 사용했습니다. 지금까지는 그렇게 좋았지 만 다음 코드가 왜 작동하지 않는지는 알 수 없습니다.lapply를 사용하는 플롯 목록

Error in `[.data.frame`(df, , i) : undefined columns selected 

좋아, 분명히 내 재현 코드에서 매우 불행한 실수를 :

df<-as.data.frame(matrix(rnorm(50),ncol=5)) 
names(df)<-c("x1","x2","x3","x4","x5") 
df1<-seq_len(10) 

ll<-lapply(seq(1,5), function(i) qplot(df1,df[,i])) 

가 나는 오류가 발생합니다. 이제 작동하지만, ll 목록의 모든 플롯은 동일한 플롯입니다. 나는이 프로그램을 실행할 때 :

do.call(grid.arrange,ll)

나는 다음과 같은 이미지를 얻을 : Grid

모든 플롯

가 동일을! 이것은 데이터를 통해 실행하면 얻을 수있는 결과이기도합니다. 당신은 당신 만이 (5)이 경우 10 열에 대한 실행을 말하고있다

+0

무엇이 오류입니까? –

+0

답변에 추가되었습니다. – Pinemangoes

+1

게시 한 플롯 예제를 보면 grid.arrange를 사용하지 않고 패싯 사용 ('facet_wrap' 또는'facet_grid')으로 전환합니다. 예를 들어 나의 대답을보십시오. Facetting은 훨씬 쉽고 유연합니다. –

답변

5

. 다음 작업을 수행해야합니다.

ll<-lapply(
    seq(1,5), 
    function(i) qplot(data=data.frame(y=df[, i]), df1, y) 
) 

이렇게하면 각 플롯에 대해 y 값이 업데이트됩니다.

기타 세부 정보 SO Post.

+3

+1! 또는 루핑을 완전히 건너 뛰고 파셋을 사용합니다. 이것이'ggplot2'가 디자인 된 방법입니다. –

+3

@PaulHiemstra, ggplot 플롯 목록이 실제로 유용한 경우가 있지만 상황에 따라 약간의 차이가 있지만이 경우에는 패싯 방식을 사용하는 것이 더 좋은 결과를 얻는 것은 당연한 것입니다. – BrodieG

+0

감사합니다. 이것은 그것을 해결합니다. – Pinemangoes

3

작동 :

ll<-lapply(seq(1,5), function(i) qplot(df1,df[,i])) 
+0

감사합니다. 내 데이터 세트에서와 동일한 문제가 발생하면서 초기 게시물을 수정했습니다. – Pinemangoes

+0

다른 사람들이 당신을 위해 편집에 응답 한 것 같습니다 :) –

4

당신이 얻을 문제는 게으른 평가와 관련이 있습니다. 즉, ll의 함수는 실제로 호출 할 때만 평가되며, 이는 grid.arrange입니다. 이 때 각 함수는 i을 찾으려고 시도합니다. 그 값은 루프의 끝에있는 i의 마지막 값이므로 해당 시간까지 5의 값을 갖습니다. 따라서 df에서 추출 된 데이터는 항상 다섯 번째 열이므로 사용자의 플롯은 모두 동일합니다.

이 문제를 방지하려면 함수를 만들 때 (예 : @ BrodieG의 메서드 사용) 강제로 데이터 추출을 수행해야합니다. 거기에 새로운 data.frame이 생성되어 df의 데이터를 선택해야합니다. 또는 force을 사용하여 i의 평가를 강제 실행할 수 있습니다. 내가 사용하는 것과 같은 data.frame에서 여러 컬럼의 플롯을 만들기위한


:

는 더 많은 예제와 게으른 평가에 대한 설명은 참조 facet_wrap. facet_wrap를 사용하려면 reshape2 패키지에서 melt를 사용하여 데이터를 다시 정렬해야합니다 게으른 평가, 또는 같은 문제가 어쨌든있다

library(ggplot2) 
library(reshape2) 
df$xvalues = 1:10 
df_melt = melt(df, id.vars = 'xvalues') 
ggplot(df_melt, aes(x = xvalues, y = value)) + 
    geom_point() + facet_wrap(~ variable) 

enter image description here

+0

이것은 qplot + grid.arrange보다 더 우아한'ggplot' +'ggsave' 콤보를 사용할 수 있기 때문에 실제로 더 나은 해결책입니다. 음식물. 도와 줘서 고마워. – Pinemangoes

+0

나는 거의 루프를 사용하지 않아도 거의 동일한 결과를 얻기 위해 패싯을 사용할 수 있습니다. –