“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问题的回答中的链接。