【问题标题】:Assigning unique id to duplicated rows为重复的行分配唯一 ID
【发布时间】:2013-03-08 20:39:58
【问题描述】:

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

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

有什么简单的方法吗?

谢谢

【问题讨论】:

  • 您的示例是否过于简单或是否包含拼写错误,因为此处的 id 与 x 完全相同?
  • 也许我的例子有点误导,我会改变它!
  • 使用data.table的类似问题:stackoverflow.com/questions/13018696/…
  • @by0 检查我改进的解决方案,它使用interaction 函数而不是paste0

标签: r duplicates dataframe


【解决方案1】:

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

 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"

【讨论】:

  • 关于paste0 的好点,我添加了一个更好的解决方案,实际上比原来的答案更整洁。
  • @Hemmo。我认为使用interaction 等同于使用paste(..., sep = '.');从理论上讲,它遇到了我正在讨论的相同(不太可能)的问题。
  • 哦,是的,你是对的,它们实际上产生了相同的东西,但它们实际上在你讨论的情况下都能正常工作,因为你得到 ab.ca.bc 是不同的。我想这就是我们想要的。 paste0 不能正常工作(如果不需要分离,这工作)。
【解决方案2】:

这是我想到的第一件事:

创建一个新变量,通过将它们的值粘贴到字符串来组合两列:

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=aby=cx=a,y=bc。如果没有,请使用paste0

【讨论】:

  • (+1) 我会将a 更改为do.call(paste0, z)。和1:length(unique(a))seq_along(unique(a))
  • 好点,我不记得 seq_alongdo.call 对我来说是新的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-08-12
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
相关资源
最近更新 更多