我想知道我是否错过了一些微不足道的事情:
在对包含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
我希望保持和排名NAs。为了我的目的,他们应该平等和最后排名。在这种情况下,要使用的ties.method
可以是默认值&#34;平均值&#34;。我正在寻找这个结果:
# [1] 2.5 10.0 1.0 10.0 4.0 6.0 7.0 10.0 2.5 5.0 8.0
从?rank帮助:&#34; NA值永远不会被认为是相等的:对于na.last = TRUE和na.last = FALSE,它们按照它们在x中出现的顺序给出不同的等级。 #34;
所以,它看起来就像我想要的那样 - 即平等对待它们并且通过使用rank
无法将它们的等级平均为最后等级。这是真的 - 有没有通过排名完成这项工作的简单方法?在执行rank(x, na.last="keep")
之后,我是否必须依赖第二行代码重新插入NA的等级?
答案 0 :(得分:3)
我不确定这是否是最优雅的解决方案,但您可以替换NA值,以便它们始终是最后一个,如下所示:
rank( replace(x, is.na(x), max(x,na.rm=TRUE) + 1) )
#[1] 2.5 10.0 1.0 10.0 4.0 6.0 7.0 10.0 2.5 5.0 8.0
答案 1 :(得分:2)
你可以向前和向后排名,然后取平均值:
(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