R 为重复的行分配唯一id
如果我有一个如下所示的数据帧:R 为重复的行分配唯一id,r,duplicates,dataframe,R,Duplicates,Dataframe,如果我有一个如下所示的数据帧: x y 13 a 14 b 15 c 15 c 14 b x y id 13 a 1 14 b 2 15 c 3 15 c 3 14 b 2 我希望每组相等的行都有一个唯一的id,如下所示: x y 13 a 14 b 15 c 15 c 14 b x y id 13 a 1 14 b 2 15 c 3 15 c 3 14 b 2 有什么简单的方法可以做到这一点吗 谢谢这是我想到的第一件事: 创建一个新变量,通过将两列的值粘贴到字符串来组合这两列: a&l
x y
13 a
14 b
15 c
15 c
14 b
x y id
13 a 1
14 b 2
15 c 3
15 c 3
14 b 2
我希望每组相等的行都有一个唯一的id,如下所示:
x y
13 a
14 b
15 c
15 c
14 b
x y id
13 a 1
14 b 2
15 c 3
15 c 3
14 b 2
有什么简单的方法可以做到这一点吗
谢谢这是我想到的第一件事: 创建一个新变量,通过将两列的值粘贴到字符串来组合这两列:
a<-paste0(z$x,z$y) #z is your data.frame
编辑:@flodel关心使用paste0
,最好使用普通的paste
,或者交互:
a<-interaction(z,drop=TRUE)
cbind(z,id=factor(a,labels=1:length(unique(a))))
a我对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))
库(plyr)
.idx是您的示例过于简单,还是包含打字错误,因为此处的id与x完全相同?也许我的示例有点误导,我将更改它!使用数据的类似问题。表
:@by0检查我的改进解决方案,它使用交互
功能而不是paste0
(+1)我将A
更改为do.call(paste0,z)
。和1:length(unique(a))
到seq_沿途(unique(a))
优点,我从来都不记得seq_沿途
和do.call对我来说是新的。谢谢。关于paste0
的观点很好,我添加了一个更好的解决方案,实际上比原来的答案更简洁。@Hemmo。我认为使用交互
相当于使用粘贴(…,sep=')
;理论上,它遇到了我刚才讨论的相同(不太可能)问题。哦,是的,你是对的,它们实际上产生了相同的东西,但它们实际上在你讨论的情况下都正常工作,因为你得到了不同的ab.c
和a.bc
。我想这就是我们想要的<代码>粘贴0
无法正常工作(如果不需要分离,则可以正常工作)。