如何根据两列中任一列中的重复值生成唯一 ID?

How to generate a unique ID based on duplicate values in either of two columns?

我希望根据两列中任一列中的相同值生成唯一 ID。具体来说,我有历史时期客户的 phone 号码和电子邮件。因此,我想生成一个识别客户的唯一 ID,即使客户在此时间段内更改了 phone 号码或电子邮件。数据如下所示:

E-mail         Phone      Name
mortena        3076       morten
kaspera        2688       kasper
christoffera   1212       christoffer
mortenb        3076       morten
mortena        3075       morten
kasperb        2688       kasper
christoffera   1213       christoffer

我想产生这样的结果:

E-mail         Phone      Name        ID
mortena        3076       morten      1
kaspera        2688       kasper      2
christoffera   1212       christoffer 3
mortenb        3076       morten      1
mortena        3075       morten      1
kasperb        2688       kasper      2
christoffera   1213       christoffer 3

非常感谢任何帮助!

我尝试使用下面的代码。但是,这似乎是根据相同的电子邮件和 phone 号码创建 ID。我希望根据电子邮件或 phone 号码生成唯一 ID。

test_data %>% 
  mutate(ID = group_indices_(test_data, .dots=c("E.mail", "Phone")))

我希望脚本检查 phone 号码并为每个唯一的 phone 号码生成一个唯一的 ID,如果它找不到任何重复的 phone 号码然后通过电子邮件并做同样的事情。

根据我上面的评论,要重现相同的 ID 顺序,您需要确保正确的 factor 级别顺序

library(dplyr)
df %>% mutate(ID = as.integer(factor(Name, levels = unique(Name))))
#        E.mail Phone        Name ID
#1      mortena  3076      morten  1
#2      kaspera  2688      kasper  2
#3 christoffera  1212 christoffer  3
#4      mortenb  3076      morten  1
#5      mortena  3075      morten  1
#6      kasperb  2688      kasper  2
#7 christoffera  1213 christoffer  3

group_indices

df %>% mutate(ID = group_indices(., factor(Name, levels = unique(Name))))

如果 ID 的顺序无关紧要,你可以这样做

df %>% mutate(ID = as.integer(as.factor(Name)))

df %>% mutate(ID = group_indices(., Name))

在这些情况下,ID 的顺序由唯一 Name 的字母顺序(而不是它们的出现)决定。


示例数据

df <- read.table(text = "E-mail         Phone      Name
mortena        3076       morten
kaspera        2688       kasper
christoffera   1212       christoffer
mortenb        3076       morten
mortena        3075       morten
kasperb        2688       kasper
christoffera   1213       christoffer", header = T)