2013-06-24 3 views
2

하나의 데이터 프레임에서 순서가 지정된 (즉, 높은 중간에서 낮은 중간까지) 조건부 상자 플롯을 플롯하려고합니다. 일반적인 순서는 다음과 같습니다 :데이터 프레임의 열을 사용하여 여러 개의 정렬 된 조건부 상자 그림을 그립니다.

  1. variable.group에 따라 variable1에 대한 역순 정렬 그룹 중앙값;
  2. variable.group 및 정렬 된 중앙값을 사용하여 순서 조건부 상자 플롯을 작성합니다.
  3. 데이터 프레임의 나머지 변수에 대해 반복 (루프?) 프로세스.

는 I 위의 프로세스를 사용하여 대략 70으로 루프 변수 싶지만, aggregatetapply에서 이동 dataframe 각 변수에 액세스하고 반복 코딩 서열 붙어있다. 아래에있는 내 R 코드에서 우아함의 부족에 미리 사과 :

bpdf = data.frame(group=c("A","A","A","B","B","B","C","C","C"), 
      x=c(1,1,2,2,3,3,3,4,4), 
      y=c(7,5,2,9,7,6,3,1,2), 
      z=c(4,5,2,9,8,9,7,6,7)) 

sorted.medians = rev(sort(with(bpdf,tapply(bpdf$x,bpdf$group,median)))) 

boxplot(bpdf$x~factor(bpdf$group,levels=names(sorted.medians))) 

답변

2

내가 당신을 생각 2 줄을 넣어야합니다. lapply :

lapply(bpdf[,-1],function(x){ 
    ## decreasing better than rev here 
    y <- sort(tapply(x,bpdf$group,median),decreasing=TRUE) 
    boxplot(x~factor(bpdf$group,levels=names(y))) 
}) 

편집이 변수 이름을 플롯, 당신은 상자 그림의 main 인수를 사용하고 bpdf의 colanmes을 통해 당신은 루프 : 모두 답변을

lapply(colnames(bpdf[,-1]),function(i){ 
    ## decreasing better than rev here 
    x <- bpdf[,i] 
    title <- paste0('title',i) ## you can change it here 
    y <- sort(tapply(x,bpdf$group,median),decreasing=TRUE) 
    boxplot(x~factor(bpdf$group,levels=names(y)),main=title) 
}) 
+0

감사합니다! 나는 둘 다 upvote하지만 내가 멍청이 이후로 수 없습니다. –

+0

어떻게 각 변수 이름을 각 플롯의 제목으로 추가 할 수 있습니까? 다음은 모든 var 이름을 추가합니다. par (mfrow = c (1,3)) lapply (bpdf [-1], function (x) { y <- sort (tapply (x, bpdf $ group, median), reduce = TRUE) @QuiGonJin boxplot (xpd ($ bpf $ group, levels = names (y)), 메인 = 붙여 넣기 (이름 (bpdf [-1])) } –

+0

여전히 허용됩니다. 그 옆에있는 큰 눈금을 클릭하여 대답. – flodel

1

내가 제대로 질문을 이해한다면, 내가 생각하는 당신이 원하는 일을해야 다음

  1. 로드를 몇 패키지와

    library(plyr) 
    library(reshape2) 
    dd = data.frame(group=c("A","B","C", "D"), 
           x1=runif(40),x2=runif(40),x3=runif(40),x4=runif(40)) 
    
  2. 지금 변수 및 그룹

    을에 중간 조건을 계산 : 일부 데이터를 생성
    dd_m = melt(dd, "group") 
    meds = ddply(dd_m, c("variable", "group"), summarise, m = median(value)) 
    
  3. 주문 데이터 변수와 중간에 의해 프레임 : 변수를 통해

    sorted_meds = meds[with(meds, order(variable, -m)), ] 
    
  4. 보고, 분류 차례로 각각의 데이터 프레임 :

    for(var in unique(sorted_meds$variable)){ 
        grp_order = sorted_meds[sorted_meds$variable==var, ]$group 
        dd_tmp = dd_m[dd_m$variable==var,] 
        dd_tmp$group = factor(dd_tmp$group, levels = grp_order) 
        boxplot(dd_tmp$value ~ dd_tmp$group) 
    }