Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 为重复的行分配唯一id_R_Duplicates_Dataframe - Fatal编程技术网

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
无法正常工作(如果不需要分离,则可以正常工作)。