2015-05-12 15 views
8

Khi cố gắng hiểu '%_rank' là gì, Tôi đã xem qua mã và tìm thấy biểu thức length(!is.na(x)). Tôi không thể nghĩ về bất kỳ tình huống nào trong đó length(x) != length(!x) vì vậy tôi tự hỏi nếu đây là lỗi đánh máy (có lẽ nó phải là sum(!is.na(x))?) Hoặc nếu đây thực sự là một tình huống như vậy ??Typo trong `dplyr :: percent_rank`?

+2

Tôi đồng ý với bạn. Các yêu cầu để mở rộng phạm vi 0,1 và 'dplyr :: percent_rank (1:10)' sẽ trả về 1 nhưng 'dplyr :: percent_rank (c (1:10, NA))' sẽ không. – MrFlick

+1

Rất thú vị. Vấn đề tương tự cũng xuất hiện trong 'cume_dist()'. Tôi đã gửi yêu cầu kéo dựa trên bài đăng này: https://github.com/hadley/dplyr/pull/1133 –

Trả lời

1

Từ ?is.na tôi thấy hai khả năng:

  1. Đầu tiên là nếu phương pháp mặc định của is.na() được sử dụng, sau đó nó được ghi chép lại để trở về "một vector logic của chiều dài tương tự như đối số của nó x, chứa TRUE cho các yếu tố đó được đánh dấu NA hoặc đối với các vectơ số hoặc phức tạp, NaNFALSE nếu không. " (từ ?is.na, phần Giá trị).

    Do đó bạn chính xác trong phỏng đoán rằng không có trường hợp nào là length(is.na(x)) != length(!is.na(x)).

  2. Nếu phương pháp không mặc định được áp dụng, tác giả của phương thức đó có thể trả về một đối tượng không tương thích với tài liệu chung (và phương thức mặc định). Trong trường hợp đó, tất cả mọi phiên cược đều bị tắt.

    Tôi thấy tùy chọn này hơi căng, nhưng có thể xảy ra nếu ngược lại.

Tôi đề nghị bạn báo cáo Vấn đề về repo github của Hadley.

+0

Cảm ơn, tôi đã đề xuất nó [ở đây] (https://github.com/hadley/dplyr/issues/1132) – Jthorpe

1

Tôi nghĩ rằng đó là vấn đề ưu tiên. Ngay cả trợ giúp cũng cho biết:

x vectơ giá trị để xếp hạng. Thiếu giá trị còn lại. Nếu bạn muốn coi chúng là giá trị nhỏ nhất hoặc lớn nhất, thay thế bằng Inf hoặc -Inf trước khi xếp hạng.

Nếu bạn phân hủy percent_rank đến các yếu tố cá nhân và áp dụng đối với một vector mẫu mà bạn nhận được:

> x <- c(1, 1, 2, 3, NA) 
> left <- rank(x, ties.method = "min", na.last = "keep") - 1 
> right <- length(!is.na(x)) - 1 
> out <- left/right 
> out 
[1] 0.00 0.00 0.50 0.75 NA 
> x[is.na(x)] <- Inf 
> left <- rank(x, ties.method = "min", na.last = "keep") - 1 
> right <- length(!is.na(x)) - 1 
> out <- left/right 
> out 
[1] 0.00 0.00 0.50 0.75 1.00 

Tôi tốt với thế chức năng làm việc ngay bây giờ. Bạn chỉ cần đảm bảo rằng NA được đổi thành Inf/-Inf nếu bạn muốn nhận phạm vi 0-1. Những gì tôi không chắc chắn về, nếu điều này phù hợp với tiêu chuẩn SQL2003.

+0

Tôi cho rằng trong ví dụ đầu tiên của bạn, các giá trị 'NA' đang được xử lý không nhất quán: là giá trị lớn nhất, vì chúng làm giảm giá trị được xuất ra khác - nhưng chúng cũng bị bỏ lại" như là "ở chỗ chúng trả về NA. Bất kể, nếu nó được thiết kế để hoạt động như thế này, có mã mẫu số hiện tại gọi là '! Is.na' vì không có lý do nào sẽ là một cách kỳ lạ để thực hiện. Xem liên kết trong câu trả lời của tôi cho vấn đề GitHub có liên quan cho một số cuộc thảo luận về chức năng dự định. –

2

Đây là lỗi. Mã này đã được giới thiệu trong this commit, là một câu trả lời được nêu rõ cho issue 774. Hadley viết trong số phát hành # 774:

Oh oops, tôi muốn nói đó là lỗi trong triển khai R của tôi. Mẫu số phải là số lượng không phải là NA, không phải là độ dài.(nhấn mạnh thêm)

Chúng tôi không cần các tùy chọn để kiểm soát hành xử, chỉ cần đảm bảo rằng NA ở đầu vào là NA sản lượng

Nhưng khi bạn lưu ý, nó cần phải có được sum(!is.na(x)) không length để thực hiện sửa chữa dự định.