Сортировка коробчатого участка на основе медианного значения - PullRequest
32 голосов
/ 22 сентября 2010

Я хотел бы использовать R, чтобы составить серию коробочных диаграмм, которые отсортированы по медианному значению.Предположим, тогда я выполню:

boxplot(cost ~ type)

Это даст мне несколько коробочных графиков, где стоимость показана на оси y, а категория типов видна на оси x:

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

Однако, то, что я хотел бы, это цифры на коробчатом графике, отсортированные от наибольшего до минимального среднего значения.Я подозреваю, что мне нужно изменить метки типа (A или B), чтобы численно указать, какое значение является самым низким и самым высоким медианой, но мне интересно, есть ли более разумный способ решения проблемы.

Ответы [ 3 ]

48 голосов
/ 22 сентября 2010

Выезд ?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")
12 голосов
/ 22 сентября 2010

Да, это идея:

> 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
0 голосов
/ 24 августа 2016

Остерегайтесь пропущенных значений, вы должны добавить 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")
...