同样在向量中排名NA [r]

时间:2014-09-04 03:27:19

标签: r 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

我希望保持和排名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的等级?

2 个答案:

答案 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