2014-12-02 12 views
5

Đây là đoạn mã để xếp hạng dựa trên cột v2:Cách xếp hạng các hàng theo hai cột cùng một lúc trong R?

x <- data.frame(v1 = c(2,1,1,2), v2 = c(1,1,3,2)) 
x$rank1 <- rank(x$v2, ties.method='first') 

Nhưng tôi thực sự muốn để xếp hạng dựa trên cả v2 và/sau đó v1 vì có mối quan hệ trong v2. Làm thế nào tôi có thể làm điều đó mà không cần sử dụng RPostgreSQL?

Trả lời

1

Làm thế nào về:

within(x, rank2 <- rank(order(v2, v1), ties.method='first')) 

# v1 v2 rank1 rank2 
# 1 2 1  1  2 
# 2 1 1  2  1 
# 3 1 3  4  4 
# 4 2 2  3  3 
+1

Đầu tiên, 'ties.method' là không cần thiết,' order' sẽ không có quan hệ. Thứ hai, nó không thành công với dữ liệu này: 'x <- data.frame (v1 = c (2,3,1,2,1), v2 = c (1,1,3,2,1))', vì vậy nó chỉ là sai. – user

2

order công trình, nhưng đối với thao tác khung dữ liệu, cũng kiểm tra plyrdplyr gói.

> arranged_x <- arrange(x, v2, v1) 
0

Ở đây chúng ta tạo ra một chuỗi các con số và sau đó sắp xếp lại nó như thể nó đã được tạo ra gần các dữ liệu ra lệnh:

x$rank <- seq.int(nrow(x))[match(rownames(x),rownames(x[order(x$v2,x$v1),]))] 

Hoặc:

x$rank <- (1:nrow(x))[order(order(x$v2,x$v1))] 

Hoặc thậm chí:

x$rank <- rank(order(order(x$v2,x$v1))) 
Các vấn đề liên quan