2013-06-24 44 views
2

我試圖從單個數據框繪製幾個有序(即,從高到低的中值)條件框圖。通用序列如下:使用數據幀中的列繪製多個有序條件框圖

  1. 根據variable.group對變量1進行反向排序組中間值;
  2. 使用variable.group和排序的中位數創建有序的條件框圖;
  3. 對數據幀中的其餘變量重複(循環?)過程。

欲通過循環約70變量使用上述方法,但從tapply是卡移動到aggregate,在數據幀訪問每個可變的,並且編碼的循環序列。提前道歉在我下面的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

感謝兩個答案!我喜歡你們兩個,但因爲我是一個noob,所以不能。 –

+0

如何將每個變量名稱添加爲每個圖的標題?下面添加所有的var名稱:par(mfrow = c(1,3)) lapply(bpdf [-1],function(x){ - {sort(tapply(x,bpdf $ group,median) = true) boxplot(x〜factor(bpdf $ group,levels = names(y)), main = paste(names(bpdf [-1]))) }) –

+0

@QuiGonJin,仍然鼓勵您接受通過點擊旁邊的大記號來回答。 – 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) 
    } 
    
相關問題