在R中使用stringi生成唯一的随机字符串

3
我有一些数据,每行代表一个人。我想生成一个随机的唯一ID,以便在分析中识别他们。
以下是一个示例数据框:
df <- data.frame(
  gender = rep(c("M", "F", "M", "M", "F"), 1000),
  qtr = sample(c(1:99), 50000, replace = T),
  result = sample(c(100:1000), 50000, replace = T)
)

生成一个唯一的ID,我正在使用stringi。
library(stringi)
library(magrittr)
library(tidyr)

df <- df %>%
  mutate(UniqueID = do.call(paste0, Map(stri_rand_strings, n=50000, length=c(2, 6),
                                        pattern = c('[A-Z]', '[0-9]'))))

然而,当我测试新变量UniqueID是否唯一时,运行这段代码后,我发现有些重复。
length(unique(unlist(df[c("UniqueID")])))

有没有一种方法可以生成真正唯一的ID,没有重复的?
我看到了这些问题,但它并没有回答如何使生成的随机数唯一。 在R中生成数据框列中的唯一随机数 创建每个列中具有随机数的数据框 谢谢。
3个回答

9
您可以使用ids包自动生成唯一ID。例如,要生成1000万个用户ID,您可以使用以下内容:
randos <- ids::random_id(1E6, 4)
# The 2nd term here controls how many bytes are assigned to each ID.
# The default, 16 bytes, makes much longer IDs and crashes my computer

head(randos)
#[1] "31ca372d" "d462e55f" "2374cc78" "15511574" "ecbf2d65" "236cb2d3"

它还有其他不错的功能,比如adjective_animal函数,可以创建更易于人类识别和记忆的ID。

creatures <- ids::adjective_animal(1E6, n_adjectives = 1)
head(creatures)
#[1] "yestern_lizard"          "insensible_purplemarten"
#[3] "cubical_anhinga"         "theophilic_beaver"      
#[5] "subzero_greyhounddog"    "hurt_weasel"   

嗯,由于某种原因,在您的第一个命令和 10,000 个 ID 中,我有一个重复项。我运行了 name <- ids::random_id(n, 4) 并两次得到了值 519299b2 - Patrick Coulombe
1
谢谢,我没有意识到它们不是可靠的唯一标识。这里有一个相关的问题,提供了一些替代建议来确保/增加唯一性的机会:https://stackoverflow.com/a/64139202/6851825 - Jon Spring
谢谢,我已经这样做了(使用repeat()并在没有重复项时中断)。事实上,我认为我只是不走运,因为之后我无法再现它... 哦,算了。 - Patrick Coulombe

2

也许不是您想要的,但使用自己的脚本,您始终可以生成更大的随机字符串向量(例如60,000个),然后根据需要子集一个定义数量的唯一字符串(50,000):

df <- df %>%
  mutate(UniqueID = sample( unique(do.call(paste0, 
                                           Map(stri_rand_strings, n=60000, length=c(2, 6),
                                           pattern = c('[A-Z]', '[0-9]')))), 50000) ) 

length(unique(unlist(df[c("UniqueID")])))

1
生成随机字符串可能会导致重复,我们可以通过使用足够复杂的规则来制作随机字符串,从而使得重复出现的概率变得非常小。例如,将两个随机字符串组合在一起,以创建一个唯一的ID
library(stringi)
df$UniqueID <- paste0(stri_rand_strings(5000, 2, '[A-Z]'), 
                      stri_rand_strings(5000, 6,'[0-9]'))

这样做可以大大降低UniqueID重复的概率。您可以尝试使用不同的lengthpattern参数进行各种组合,以生成唯一的ID。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接