我想知道我是否遗漏了一些微不足道的东西:
在对包含NA的此类矢量进行排名时,有四种选择如何处理NA:
x<-c(5, NA, 3, NA, 6, 9, 10, NA, 5, 7, 12)
rank(x, na.last=T)
# [1] 2.5 9.0 1.0 10.0 4.0 6.0 7.0 11.0 2.5 5.0 8.0
rank(x, na.last=F)
# [1] 5.5 1.0 4.0 2.0 7.0 9.0 10.0 3.0 5.5 8.0 11.0
rank(x, na.last=NA)
# [1] 2.5 1.0 4.0 6.0 7.0 2.5 5.0 8.0
rank(x, na.last="keep")
# [1] 2.5 NA 1.0 NA 4.0 6.0 7.0 NA 2.5 5.0 8.0
Run Code Online (Sandbox Code Playgroud)
我希望保持和排名NAs.为了我的目的,他们应该平等和最后排名.在这种情况下ties.method,要使用的是默认的"平均值".我正在寻找这个结果:
# [1] 2.5 10.0 1.0 10.0 4.0 6.0 7.0 10.0 2.5 5.0 8.0
Run Code Online (Sandbox Code Playgroud)
从?rank帮助:"NA值永远不会被认为是相等的:对于na.last = TRUE和na.last = FALSE,它们按照它们在x中出现的顺序给出不同的等级."
所以,它看起来像我想要的 - 即平等对待它们并且通过使用不可能将它们的等级平均为最后等级rank.这是真的 - 有没有通过排名完成这项工作的简单方法?在做完之后,我是否必须依赖第二行代码重新插入NA的等级 rank(x, na.last="keep") ?
您可以将其向前和向后排序,然后取平均值:
(rank(x, na.last=T) + rev(rank(rev(x), na.last=T))) / 2
# [1] 2.5 10.0 1.0 10.0 4.0 6.0 7.0 10.0 2.5 5.0 8.0
Run Code Online (Sandbox Code Playgroud)