【问题标题】:Ranking NAs in a vector equally [r]对向量中的 NA 进行平均排名 [r]
【发布时间】:2014-09-04 03:27:19
【问题描述】:

我想知道我是否在这里遗漏了一些琐碎的事情:

当对这样一个包含 NAs 的向量进行排序时,有四种处理 NAs 的选项:

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

我希望保留 NA 并对其进行排名。出于我的目的,它们应该被排在最后。在这种情况下,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

来自 ?rank 帮助:“NA 值永远不会被认为是相等的:对于 na.last = TRUE 和 na.last = FALSE,它们按照它们在 x 中出现的顺序被赋予不同的等级。”

所以,这看起来像我想要的 - 即通过使用 rank 来平等对待他们并将他们的排名平均为最后排名是不可能的。这是真的吗 - 没有简单的方法可以通过排名完成这项工作吗?在执行rank(x, na.last="keep") 之后,我是否必须依靠第二行代码重新插入 NA 的等级?

【问题讨论】:

    标签: r na


    【解决方案1】:

    我不确定这是否是最优雅的解决方案,但您可以替换 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
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2018-12-25
        • 2013-07-21
        • 1970-01-01
        • 2020-08-19
        • 1970-01-01
        • 1970-01-01
        • 2011-05-16
        • 1970-01-01
        • 2014-05-16
        相关资源
        最近更新 更多