Typo in `dplyr::percent_rank`?

时间:2015-05-12 22:40:17

标签: r dplyr

In trying to understand what 'percent_rank' does, I took a peek at the code and found the expression page.find('#foo').find('.bar'). I can't think of any situation in which length(!is.na(x)) so I'm wondering if this is a typo (perhaps it should be length(x) != length(!x)?) or if here really is such a situation??

3 个答案:

答案 0 :(得分:2)

这是一个错误。此代码是在this commit中引入的,这是对issue 774的声明回复。哈德利在第774期写道:

  哦,哎呀,我说这是我实施R中的一个错误。 分母   应该是非NA的数量,而不是长度。 (强调添加)

     

我们不需要选项来控制行为,只需确保输入中的NA   是输出中的NA

但是正如您所指出的那样,应该sum(!is.na(x))而不是length来实现预期的修复。

答案 1 :(得分:1)

?is.na我看到两种可能性:

  1. 第一个是,如果使用默认方法is.na(),则记录它返回"一个与其参数x长度相同的逻辑向量,包含TRUE标记为NA的元素,或者对于数字或复杂向量,NaNFALSE。{34} (来自?is.na,价值部分)。

    因此,你猜测没有length(is.na(x)) != length(!is.na(x))的情况是正确的。

  2. 如果应用了非默认方法,则该方法的作者可能返回与泛型(和默认方法)文档不兼容的对象。在这种情况下,所有赌注都已关闭。

    我觉得这个选项有点牵强,但如果有悖常理,这是可能的。

  3. 我建议您报告Hadley' github repo的问题。

答案 2 :(得分:1)

我认为这是一个偏好问题。甚至帮助说:

  

x要排名的值的向量。丢失的值保持不变。   如果您想将它们视为最小值或最大值,   在排名之前用Inf或-Inf替换。

如果将percent_rank分解为单个元素并应用于样本向量,则会得到:

> 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

我对这个功能现在如何运作很好。如果您希望始终获得0-1范围,则只需确保NA更改为Inf/-Inf。我不确定,如果这符合SQL2003标准。