4

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

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

有什么简单的方法可以做到这一点吗?

谢谢

4

2 回答 2

4

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

 x  y
ab  c
 a bc

一种解决方案是替换paste0(...)paste(..., sep = "@"). 即便如此,你也无法想出一个sep足够通用的方法来处理任何类型的数据,因为某种数据中总是存在非零概率sep

更稳健的方法是使用拆分/转换/组合方法。你当然可以用这个base包来做,但plyr会更容易一些:

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

如果这太慢了,我会推荐一种data.table方法,如下所示:data.table "key indices" or "group counter"

于 2013-03-08T21:27:34.963 回答
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=cx=a, y=bc。如果没有,则使用paste0.

于 2013-03-08T20:53:26.693 回答