Cra*_*aig 0 r uniqueidentifier unique-key dplyr ids
我想为数据库中的行生成唯一的 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
Run Code Online (Sandbox Code Playgroud)
这是一些示例数据,我可以使用它们来表示将附加到现有数据库的新数据:
new_data <- sample(babynames$name, 5)
print(new_data)
first_name
1 Hamzeh
2 Mahmoud
3 Matelyn
4 Camila
5 Renae
Run Code Online (Sandbox Code Playgroud)
现在,我想要的是使用该函数绑定随机生成的 ID 的新列random_id,同时检查以确保新生成的 ID 与对象中的任何现有 ID 不匹配database。如果生成器创建了相同的 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)
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于,我需要构建无穷无尽的嵌套if语句流,以便再次根据原始数据库不断测试新生成的值。我需要一个过程来继续测试,直到生成原始数据库中找不到的真正唯一的值。
使用ids::uuid()可能会避免检查重复的 id 值。事实上,如果要生成 10 万亿个 uuid,则每个uuid 是什么?两个 uuid 相同的概率为 0.00000006。
这是一个基本函数,可以快速检查重复值,而无需进行任何迭代:
anyDuplicated(1:4)
[1] 0
anyDuplicated(c(1:4,1))
[1] 5
Run Code Online (Sandbox Code Playgroud)
上面的第一个结果显示没有重复值。第二个显示元素 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)
}
Run Code Online (Sandbox Code Playgroud)
全部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
Run Code Online (Sandbox Code Playgroud)