33

我想使用 R 制作一系列按中值排序的箱线图。假设然后我执行:

boxplot(cost ~ type)

这会给我一些箱线图,成本显示在 y 轴上,类型类别在 x 轴上可见:

-----     -----
  |         |
 [ ]        |
  |        [ ]
  |         |
-----     -----
  A         B

但是,我想要的是从最高到最低中值排序的箱线图数字。我的怀疑是,我需要做的是更改类型(A 或 B)的标签以用数字表示哪个是最低和最高中值,但我想知道是否有更聪明的方法来解决这个问题。

4

3 回答 3

48

退房?reorder。该示例似乎是您想要的,但以相反的顺序排序。我-count在下面的第一行中进行了更改,以按照您想要的顺序进行排序。

  bymedian <- with(InsectSprays, reorder(spray, -count, median))
  boxplot(count ~ bymedian, data = InsectSprays,
          xlab = "Type of spray", ylab = "Insect count",
          main = "InsectSprays data", varwidth = TRUE,
          col = "lightgray")
于 2010-09-22T02:54:09.280 回答
13

是的,就是这个想法:

> set.seed(42)                     # fix seed       
> DF <- data.frame(type=sample(LETTERS[1:5], 100, replace=TRUE), 
+                  cost=rnorm(100)) 
>
> boxplot(cost ~ type, data=DF)    # not ordered by median
>
> # compute index of ordered 'cost factor' and reassign          
> oind <- order(as.numeric(by(DF$cost, DF$type, median)))    
> DF$type <- ordered(DF$type, levels=levels(DF$type)[oind])   
>
> boxplot(cost ~ type, data=DF)    # now it is ordered by median
于 2010-09-22T02:54:36.907 回答
0

当心缺失值,你必须添加na.rm = TRUE它才能工作。如果没有,代码根本不起作用。我花了几个小时才发现这一点。

  bymedian <- with(InsectSprays, reorder(spray, -count, median, **na.rm = TRUE**)
  boxplot(count ~ bymedian, data = InsectSprays,
          xlab = "Type of spray", ylab = "Insect count",
          main = "InsectSprays data", varwidth = TRUE,
          col = "lightgray")
于 2016-08-24T13:41:08.647 回答