我的数据有一个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
答案 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
您可能想要记住该功能,只要您进行复杂的数据操作就非常有用。