Подтвердить что ты не робот

Сортировка ящика на основе медианного значения

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

boxplot(cost ~ type)

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

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

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

4b9b3361

Ответ 1

Отъезд ?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")

Ответ 2

Да, это идея:

> 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

Ответ 3

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