2010-07-07 28 views
7

Tôi đang cố gắng để đặt hàng dataframe này bằng dân số và ngày, vì vậy tôi đang sử dụng order()rank() chức năng:Làm thế nào tôi có thể tạo ra một ties.method mới với hàm R rank()?

> df <- data.frame(idgeoville = c(5, 8, 4, 3, 4, 5, 8, 8), 
        date  = c(rep(1950, 4), rep(2000, 4)), 
        population = c(500, 450, 350, 350, 650, 500, 500, 450)) 
> df 
    idgeoville date population 
1 5   1950  500 
2 8   1950  450 
3 4   1950  350 
4 3   1950  350 
5 4   2000  650 
6 5   2000  500 
7 8   2000  500 
8 8   2000  450 

Với ties.method = "first" Tôi không có vấn đề, cuối cùng tôi đang sản xuất dataframe này:

idgeoville date population rank 
1 5   1950  500  1 
2 8   1950  450  2 
3 4   1950  350  3 
4 3   1950  350  4 
5 4   2000  650  1 
6 5   2000  500  2 
7 8   2000  500  3 
8 8   2000  450  4 

Nhưng trên thực tế, tôi muốn có một dataframe với xếp hạng bình đẳng cho bằng cấp bậc dân, như thế này:

idgeoville date population rank 
1 5   1950  500  1 
2 8   1950  450  2 
3 4   1950  350  3 
4 3   1950  350  3 
5 4   2000  650  1 
6 5   2000  500  2 
7 8   2000  500  2 
8 8   2000  450  3 

Làm cách nào để giải quyết vấn đề này với R? Với tùy chỉnh ties.method() hoặc một thủ thuật R khác?

+0

gì về mối quan hệ = min, hoặc tối đa, hoặc trung bình ... tất cả họ đều giữ hàng ngũ của các mối quan hệ cùng một giá trị. – John

+0

Với phút và x2 <- c (1,1,2,3), tôi có 1 1 3 4/ Với tối đa và x2 <- c (1,1,2,3), tôi có 2 2 3 4 Tôi muốn kết quả này cho x2 rank => 1 1 2 3 – reyman64

+0

Hoặc, sử dụng 'max' và trừ số lượng quan hệ khỏi kết quả? '2 2 3 4-1 = 1 1 2 3'. Bây giờ, vấn đề là để tìm ra số lượng các mối quan hệ ... Dù sao, tôi chỉ xảy ra qua chủ đề này thông qua Google. – Frank

Trả lời

4

Tôi tin rằng không có tùy chọn để làm điều đó với thứ hạng; đây là một chức năng tùy chỉnh mà sẽ làm những gì bạn muốn, nhưng nó có thể là quá chậm nếu dữ liệu của bạn là rất lớn:

Rank<-function(d) { 
    j<-unique(rev(sort(d))); 
    return(sapply(d,function(dd) which(dd==j))); 
} 
+0

Thx rất nhiều, được rồi! Nhưng nếu một người khác có giải pháp tốt hơn và/hoặc nhanh hơn với gói R, tôi sẽ làm! – reyman64

1

này trả lời một câu hỏi hơi khác nhau, cụ thể là làm thế nào để sắp xếp một đối tượng data.frame dựa trên nhiều cột. Để làm điều này, bạn có thể sử dụng chức năng sort_df trong gói reshape:

> library(reshape) 
> sort_df(df,vars=c('date','population')) 
    idgeoville date population 
3   4 1950  350 
4   3 1950  350 
2   8 1950  450 
1   5 1950  500 
8   8 2000  450 
6   5 2000  500 
7   8 2000  500 
5   4 2000  650 
+0

Điều này không trả lời được câu hỏi. Ngoài ra, 'dân số' được sắp xếp theo thứ tự tăng dần trong khi xếp hạng tôi mong đợi thứ tự giảm dần (lớn nhất đầu tiên). – Uwe

6

Nhiều cách đơn giản:

pop.rank <- as.numeric(factor(population)) 
+0

Điều này chỉ sử dụng 'dân số' và bỏ qua' ngày' được yêu cầu bởi OP. Vì vậy, nó sẽ tạo ra một thứ hạng tổng thể nhưng không phải là một thứ hạng riêng biệt cho mỗi 'ngày'. – Uwe

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