【发布时间】:2020-09-29 20:21:39
【问题描述】:
我想为我的数据库中的行生成唯一 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()函数。 cran.r-project.org/web/packages/ids/vignettes/ids.html -
@manotheshark,我看不出
ids::uuid()函数将如何解决我的问题。它只是一个用于生成不同类型 ID 的函数,它不一定会根据预先存在的 ID 向量检查新生成的 ID。
标签: r dplyr uniqueidentifier unique-key ids