生成新的唯一ID号,同时排除R

问题描述

我想为数据库中的行生成唯一的ID。我将不断向该数据库添加条目,因此我需要一并生成新的ID。尽管我的数据库相对较小,并且随机ID的复制机会很小,但我仍然想建立一个程序化的故障保护机制,以确保我永远不会生成过去已经使用过的ID。

对于初学者来说,以下是一些我可以用来启动示例数据库的示例数据:

library(tidyverse)
library(ids)
library(babynames)
    
database <- data.frame(rid = random_id(5,5),first_name = sample(babynames$name,5))

print(database)
          rid first_name
1  07282b1da2      Sarit
2  3c2afbb0c3        Aly
3  f1414cd5bf    Maedean
4  9a311a145e    Teriana
5  688557399a    Dreyton

这是一些示例数据,我可以使用它们来表示将附加到现有数据库的新数据:

new_data <- sample(babynames$name,5)

print(new_data)

 first_name
1    Hamzeh
2   Mahmoud
3   Matelyn
4    Camila
5     Renae

现在,我想要的是使用random_id函数绑定一列随机生成的ID,同时检查以确保新生成的ID与database对象中的任何现有ID不匹配。如果生成器创建了相同的ID,则理想情况下它将生成一个新的替换,直到创建一个真正唯一的ID。

任何帮助将不胜感激!

更新

我想到了可能会有所帮助但仍然有限的可能性。我可以生成新的ID,然后使用for()循环来测试现有数据库中是否存在任何新生成的ID。如果是这样,那么我将重新生成一个新的ID。例如...

new_data$rid <- random_id(nrow(new_data),5)

for(i in 1:nrow(new_data)){
  if(new_data$rid[i] %in% unique(database$rid)){
    new_data$rid[id] = random_id(1,5)
  }
}

这种方法的问题是,我将需要构建无休止的嵌套if语句流,以再次针对原始数据库连续测试新生成的值。我需要一个过程来进行测试,直到生成在原始数据库中找不到的真正唯一的值为止。

解决方法

使用ids::uuid()可能会避免必须检查重复的id值。实际上,如果您要生成10万亿个uuid,则每What is a UUID?的两个uuid都将是.00000006的几率相同。

这是一个基本函数,可以快速检查重复值,而无需进行任何迭代:

anyDuplicated(1:4)
[1] 0

anyDuplicated(c(1:4,1))
[1] 5

上面的第一个结果表明没有重复的值。第二个显示元素5是重复的,因为1被使用了两次。以下是不进行重复检查的方法,new_data复制了database$rid,所以所有五个都是重复的。这将重复进行,直到所有rid都是唯一的为止,但是请注意,它假定所有现有的database$rid都是唯一的。

library(ids)
set.seed(7)
new_data$rid <- database$rid
repeat {
  duplicates <- anyDuplicated(c(database$rid,new_data$rid))
  if (duplicates == 0L) {
    break
  }
  new_data$rid[duplicates - nrow(database)] <- random_id(1,5)
}

所有new_data$rid已替换为唯一值。

rbind(database,new_data)

          rid first_name
1  07282b1da2      Sarit
2  3c2afbb0c3        Aly
3  f1414cd5bf    Maedean
4  9a311a145e    Teriana
5  688557399a    Dreyton
6  52f494c714     Hamzeh
7  ac4f522860    Mahmoud
8  ffe74d535b    Matelyn
9  e3dccc4a8e     Camila
10 e0839a0d34      Renae

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...