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??
答案 0 :(得分:2)
这是一个错误。此代码是在this commit中引入的,这是对issue 774的声明回复。哈德利在第774期写道:
哦,哎呀,我说这是我实施R中的一个错误。 分母 应该是非NA的数量,而不是长度。 (强调添加)我们不需要选项来控制行为,只需确保输入中的NA 是输出中的NA
但是正如您所指出的那样,应该sum(!is.na(x))
而不是length
来实现预期的修复。
答案 1 :(得分:1)
从?is.na
我看到两种可能性:
第一个是,如果使用默认方法is.na()
,则记录它返回"一个与其参数x
长度相同的逻辑向量,包含TRUE
标记为NA
的元素,或者对于数字或复杂向量,NaN
和FALSE
。{34} (来自?is.na
,价值部分)。
因此,你猜测没有length(is.na(x)) != length(!is.na(x))
的情况是正确的。
如果应用了非默认方法,则该方法的作者可能返回与泛型(和默认方法)文档不兼容的对象。在这种情况下,所有赌注都已关闭。
我觉得这个选项有点牵强,但如果有悖常理,这是可能的。
我建议您报告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标准。