为重复行分配唯一ID

时间:2013-03-08 20:39:59

标签: r duplicates dataframe

如果我有一个如下所示的数据框:

x y
13 a
14 b
15 c
15 c
14 b

我希望每组相等的行都有一个唯一的ID,如下所示:

x y id
13 a 1
14 b 2
15 c 3
15 c 3
14 b 2

有没有简单的方法可以做到这一点?

由于

2 个答案:

答案 0 :(得分:4)

我对paste0方法有点担心。如果您的列包含更复杂的数据,您可能会得到令人惊讶的结果,例如想象:

 x  y
ab  c
 a bc

一种解决方案是将paste0(...)替换为paste(..., sep = "@")。尽管如此,你还是不能提出一个sep一般的概率,它可以用于任何类型的数据,因为sep总是存在非零概率将包含在某种数据中。< / p>

更强大的方法是使用分割/变换/组合方法。您当然可以使用base包来执行此操作,但plyr会使其更容易:

library(plyr)
.idx <- 0L
ddply(df, colnames(df), transform, id = (.idx <<- .idx + 1L))    

如果速度过慢,我建议使用data.table方法,如下所示:data.table "key indices" or "group counter"

答案 1 :(得分:3)

这是我想到的第一件事:

创建一个新变量,它将两个列组合在一起,方法是将它们的值粘贴到字符串中:

a<-paste0(z$x,z$y) #z is your data.frame

将此作为一个因素并将其与您的数据框结合起来:

cbind(z,id=factor(a,labels=1:length(unique(a))))

编辑:@flodel担心使用paste0,最好使用普通paste或互动:

a<-interaction(z,drop=TRUE)
cbind(z,id=factor(a,labels=1:length(unique(a))))

这假设您要将x=aby=cx=ay=bc分开。如果没有,请使用paste0