2

我正在尝试从单个数据框中绘制几个有序(即从高到低中位数)条件箱线图。一般顺序如下:

  1. 根据 variable.group 对 variable1 的组中位数进行反向排序;
  2. 使用 variable.group 和有序中位数创建有序条件箱线图;
  3. 对数据框中的剩余变量重复(循环?)过程。

我想使用上述过程遍历大约 70 个变量,但我被卡住了从tapplyto移动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)))
4

2 回答 2

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

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)
})
于 2013-06-24T08:56:36.053 回答
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)
    }
    
于 2013-06-24T08:46:37.303 回答