2013-06-24 1 views
2

Я пытаюсь построить несколько упорядоченных (т. Е. От высоких до средних) условных графиков из одного кадра данных. Общая последовательность состоит в следующем:Участок с множеством упорядоченных условных графиков с использованием столбцов из фрейма данных

  1. Обратные группы сортировки для переменных1 в соответствии с переменной.group;
  2. Создать упорядоченный условный участок с использованием переменной.group и отсортированных медианов;
  3. Повторить (цикл?) Процесс для остальных переменных в кадре данных.

Я хочу перебрать около 70 переменных, используя описанный выше процесс, но я застрял переход от tapply к aggregate, доступ к каждой переменной в 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))) 
}) 

EDIT построить имя переменной, вы используете main аргумент boxplot и вы цикл по colanmes из bpdf:

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

Спасибо за обоих ответов! Я бы поднял вас обоих, но не могу, так как я ноб. –

+0

Как добавить каждое имя переменной в качестве заголовка для каждого графика? Следующее добавляет все имена var: par (mfrow = c (1,3)) lapply (bpdf [-1], function (x) { y <- sort (tapply (x, bpdf $ group, медиана), уменьшается = ИСТИНА) boxplot (x ~ factor (bpdf $ group, levels = names (y)), main = paste (имена (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) 
    }