如果我有一个如下所示的数据框:
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
有没有简单的方法可以做到这一点?
由于
答案 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=ab
,y=c
和x=a
,y=bc
分开。如果没有,请使用paste0
。