2014-09-04 24 views
5

Tôi tự hỏi nếu tôi là thiếu một cái gì đó tầm thường ở đây:NA Xếp hạng trong một vector không kém [r]

Khi xếp hạng một vector như thế này NA chứa, có bốn tùy chọn về cách đối phó với NAS:

x<-c(5, NA, 3, NA, 6, 9, 10, NA, 5, 7, 12) 

rank(x, na.last=T) 
# [1] 2.5 9.0 1.0 10.0 4.0 6.0 7.0 11.0 2.5 5.0 8.0 

rank(x, na.last=F) 
# [1] 5.5 1.0 4.0 2.0 7.0 9.0 10.0 3.0 5.5 8.0 11.0 

rank(x, na.last=NA) 
# [1] 2.5 1.0 4.0 6.0 7.0 2.5 5.0 8.0 

rank(x, na.last="keep") 
# [1] 2.5 NA 1.0 NA 4.0 6.0 7.0 NA 2.5 5.0 8.0 

Tôi đang tìm cách giữ và xếp hạng các NA. Vì mục đích của tôi, chúng phải được xếp hạng như nhau và cuối cùng. Trong trường hợp này, ties.method sẽ được sử dụng là ok để là "trung bình" mặc định. Tôi đang tìm kiếm kết quả này:

# [1] 2.5 10.0 1.0 10.0 4.0 6.0 7.0 10.0 2.5 5.0 8.0 

Từ rank giúp đỡ: "giá trị NA không bao giờ được coi là tương đương: cho na.last = TRUE và na.last = FALSE chúng được đưa ra cấp bậc khác nhau trong thứ tự chúng xuất hiện trong x. "

Vì vậy, nó trông giống như những gì tôi muốn - tức là để đối xử với họ như nhau và trung bình thứ hạng của họ dưới dạng xếp hạng cuối cùng là không thể thông qua việc sử dụng rank. Đây có phải là sự thật - không có cách đơn giản để thực hiện điều này thông qua xếp hạng? Tôi có phải dựa vào một dòng mã thứ hai để chèn lại thứ hạng của các Quốc hội sau khi thực hiện rank(x, na.last="keep") không?

Trả lời

2

Bạn có thể xếp hạng nó cả về phía trước và ngược lại sau đó lấy giá trị trung bình:

(rank(x, na.last=T) + rev(rank(rev(x), na.last=T)))/2 
# [1] 2.5 10.0 1.0 10.0 4.0 6.0 7.0 10.0 2.5 5.0 8.0 
3

Tôi không chắc chắn nếu điều này là giải pháp thanh lịch nhất, nhưng bạn có thể thay thế các giá trị NA để họ luôn ngoái, như vậy:

rank(replace(x, is.na(x), max(x,na.rm=TRUE) + 1)) 
#[1] 2.5 10.0 1.0 10.0 4.0 6.0 7.0 10.0 2.5 5.0 8.0 
Các vấn đề liên quan