“dplyr::percent\u rank”中的键入错误?

“dplyr::percent\u rank”中的键入错误?,r,dplyr,R,Dplyr,在试图理解“百分比排名”的作用时, 我瞥了一眼代码,发现表达式length(!is.na(x))。我想不出任何情况下length(x)!=长度(!x) 所以我想知道这是否是一个输入错误(也许它应该是sum(!is.na(x))?),或者这里是否真的有这样的情况???来自?is.na我看到了两种可能性: 第一个是,如果使用了的默认方法是.na(),那么它将被记录为返回“与其参数x长度相同的逻辑向量,对于标记为na的元素,包含TRUE,对于数字或复数向量,则返回NaN,否则返回FALSE。”(来自?

在试图理解“百分比排名”的作用时, 我瞥了一眼代码,发现表达式
length(!is.na(x))
。我想不出任何情况下
length(x)!=长度(!x)

所以我想知道这是否是一个输入错误(也许它应该是
sum(!is.na(x))
?),或者这里是否真的有这样的情况???

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

  • 第一个是,如果使用了
    的默认方法是.na()
    ,那么它将被记录为返回“与其参数
    x
    长度相同的逻辑向量,对于标记为
    na
    的元素,包含
    TRUE
    ,对于数字或复数向量,则返回
    NaN
    ,否则返回
    FALSE
    。”(来自
    ?is.na
    ,值部分)

    因此,您可以正确地推测不存在
    length(is.na(x))!=length(!is.na(x))
    的情况

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

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


  • 我建议你在哈德利的github回购上报告这个问题。

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

    要排序的值向量。缺少的值保留原样。 如果要将它们视为最小值或最大值, 在排名前替换为Inf或-Inf

    如果将
    percent\u 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
    
    >x向左向右向外
    [1] 0.00 0.00 0.50 0.75纳
    >x[is.na(x)]从左到右
    [1] 0.00 0.00 0.50 0.75 1.00
    

    我现在对函数的工作方式很满意。如果希望始终获得0-1范围,只需确保将
    NA
    更改为
    Inf/-Inf
    。我不确定的是,这是否符合SQL2003标准。

    这是一个错误。此代码是在中引入的,这是对的声明响应。Hadley在第7期中写道74:

    哦,糟糕,我得说这是我的R实现中的一个bug。分母 应该是非NAs的数量,而不是长度。(添加强调)

    我们不需要控制行为的选项,只需确保NAs在输入中 钠在输出中吗


    但是正如您所注意到的,它应该是
    sum(!is.na(x))
    而不是
    length
    来实现预期的修复。

    我同意您的意见。声明扩展到0,1的范围,并且
    dplyr::percent_rank(1:10)
    将返回1,但是
    dplyr::percent_rank(c(1:10,na))
    不会。捕捉得很好。
    cume_dist()
    中也存在同样的问题。我根据这篇文章提交了一个拉取请求:我认为在您的第一个示例中,
    NA
    值被不一致地处理:作为最大值,因为它们压下了其他输出值-但它们也保持“原样”在这一点上,它们返回NA.无论如何,如果它打算这样运行,那么毫无理由地使用当前分母代码调用
    !is.NA
    将是一种奇怪的实现方式。有关预期功能的一些讨论,请参阅我对相关GitHub问题的回答中的链接。