2010-09-22 3 views
30

Chciałbym użyć R, aby wykonać serię boków, które są posortowane według wartości median. Załóżmy, potem wykonać:Sortowanie boxów na podstawie wartości medianowej

boxplot(cost ~ type) 

Dałoby mi niektóre boxplots zostały koszt pokazany jest na osi y, a kategoria typ jest widoczny na osi x:

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

Jednak to, co ja” Podobnie jak figury w pudełku posortowane od najwyższej do najniższej wartości median. Podejrzewam, że muszę zmienić etykiety typu (A lub B), aby liczbowo wskazać najniższą i najwyższą wartość mediany, ale zastanawiam się, czy istnieje bardziej sprytny sposób rozwiązania problemu.

Odpowiedz

44

Zapoznaj się z ?reorder. Przykład wydaje się być tym, czego chcesz, ale posortowany w odwrotnej kolejności. Zmieniłem -count w pierwszym wierszu poniżej, aby posortować w żądanej kolejności.

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") 
10

Tak, to jest pomysł:

> 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

Strzeż brakujących wartości, trzeba dodać na.rm = TRUE go do pracy. Jeśli nie, kod po prostu nie działa. Znalezienie tego zajęło mi godziny.

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") 
+1

Należy określić, że odnosi się to do [odpowiedzi Joshua Ulricha] (http://stackoverflow.com/a/3766007/3982001). Powinien to być komentarz, ale może również samoistnie stanowić odrębną odpowiedź. –

+0

Oznaczono jako "nie jest odpowiedzią", ponieważ dokładnie ta sama odpowiedź została wysłana (i zaakceptowana). Użytkownik właśnie dodał nowy argument. Nie poprawia to jakości rozwiązania i nie jest wystarczającą odpowiedzią. – PoGibas