2010-09-22 37 views
30

Tôi muốn sử dụng R để tạo một loạt các ô được sắp xếp theo giá trị trung vị. Giả sử sau đó tôi thực hiện:Sắp xếp một ô mẫu dựa trên giá trị trung bình

boxplot(cost ~ type) 

này sẽ cung cấp cho tôi một số boxplots được chi phí được hiển thị trên trục y và các loại loại xuất hiện trên trục x:

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

Tuy nhiên, những gì tôi d thích là các số liệu boxplot được sắp xếp từ cao nhất đến giá trị trung vị thấp nhất. Nghi ngờ của tôi là những gì tôi cần làm là thay đổi các nhãn của loại (A hoặc B) để chỉ số đó là giá trị trung vị thấp nhất và cao nhất, nhưng tôi tự hỏi nếu có một cách thông minh hơn để giải quyết vấn đề.

Trả lời

44

Khám phá ?reorder. Ví dụ này có vẻ là những gì bạn muốn, nhưng được sắp xếp theo thứ tự ngược lại. Tôi đã thay đổi -count trong dòng đầu tiên bên dưới để sắp xếp theo thứ tự bạn muốn.

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

Vâng, đó là ý tưởng:

> 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

Cảnh giác với những giá trị bị mất, bạn phải thêm na.rm = TRUE cho nó để làm việc. Nếu không, mã sẽ không hoạt động. Tôi mất nhiều giờ để tìm ra điều đó.

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

Bạn nên xác định điều này đề cập đến câu trả lời của [Joshua Ulrich] (http://stackoverflow.com/a/3766007/3982001). Nó thực sự phải là một bình luận, nhưng nó cũng có thể tự đứng vững như một câu trả lời riêng biệt. –

+0

Tôi đã gắn cờ nó là "không phải là câu trả lời" vì câu trả lời chính xác giống nhau được đăng (và được chấp nhận). Người dùng vừa thêm đối số mới. Điều này không cải thiện chất lượng của giải pháp và không đủ để trở thành một câu trả lời riêng biệt. – PoGibas

Các vấn đề liên quan