如何在R中更改具有排名值(有序值)的值?当两个值相关时,我想给出相同的数字

时间:2014-06-10 06:04:38

标签: r ranking

我的数据有一个ID列,我想将ID重命名为等级。换句话说,我想重命名所有35->如图1所示,全部39-> 2,全部66-> 3全部77-> 4和所有90 - > 5从下面的数据。
我试图使用秩函数,但我无法处理两个并列值。我想为id中的两个绑定值给出相同的数字(例如,所有35得到1) 如何将每个ID更改为升序号?

ID
--
35
35
35
35
39
39
39
66
66
66
66
77
77
90
90
90

3 个答案:

答案 0 :(得分:5)

您可以利用因子变量将从1开始的连续值分配给排序数据:

ID <- c(35, 35, 35, 35, 39, 39, 39, 66, 66, 66, 66, 77, 77, 90, 90, 90)
as.numeric(as.factor(ID))
# [1] 1 1 1 1 2 2 2 3 3 3 3 4 4 5 5 5

这也比其他提议的方法快得多(即使在将unique(vect)分解出Vincent的sapply函数之后):

library(microbenchmark)
ID <- rnorm(10000)
microbenchmark(as.numeric(as.factor(ID)), funPascal(ID), funVincent(ID))
# Unit: milliseconds
#                       expr        min         lq     median        uq         max neval
#  as.numeric(as.factor(ID))   23.94388   24.64445   25.17679   25.8263    34.68806   100
#              funPascal(ID) 2754.19694 2822.37356 2875.71998 2929.9071  3471.90363   100
#             funVincent(ID)  416.58985  438.13800  445.29766  458.8043   769.44278   100

答案 1 :(得分:0)

以下是一种使用recodeVar{doBy}的方法:

library(doBy)
ID <- c(35, 35, 35, 35, 39, 39, 39, 66, 66, 66, 66, 77, 77, 90, 90, 90)
src <- unique(sort(ID))
tgt <- seq_along(src)
ID <- recodeVar(ID, src, tgt)
ID
[1] 1 1 1 1 2 2 2 3 3 3 3 4 4 5 5 5

答案 2 :(得分:0)

在您的特定情况下,josilber的解决方案比我提出的解决方案工作得非常好和简单。但是,使用sapply(或其他类似apply的函数)是对如何转换矢量&#39;的更通用的答案。问题。在您的情况下,以下内容返回您想要的内容:

vect<-c(2,2,3,5,5,6,8)
sapply(1:length(vect),FUN=function (i) 1+sum(unique(vect)<vect[i]))
[1] 1 1 2 3 3 4 5

您可能想要记住该功能,只要您进行复杂的数据操作就非常有用。