如果我有一个如下所示的数据框:
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
有什么简单的方法可以做到这一点吗?
谢谢
如果我有一个如下所示的数据框:
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
有什么简单的方法可以做到这一点吗?
谢谢
我对这种方法有点担心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"
这是我首先想到的:
创建一个新变量,通过将它们的值粘贴到字符串来组合两列:
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
.