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

问题描述 投票:0回答:2

我有每行是一个人的数据。我想制作一个随机生成的唯一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?

我已经看到了这些问题,但是它没有回答如何使生成的随机数唯一。Generating unique random numbers in dataframe column in RCreate a dataframe with random numbers in each column

感谢

r string random stringi
2个回答
0
投票

生成随机字符串可能会导致重复,我们可以做的一件事就是使带有规则的随机字符串足够复杂,以使出现重复的可能性变得很小。例如,组合两个随机字符串以组成唯一的ID,例如

library(stringi)
df$UniqueID <- paste0(stri_rand_strings(5000, 2, '[A-Z]'), 
                      stri_rand_strings(5000, 6,'[0-9]'))

[这减少了UniqueID大量复制的机会。您可以尝试使用不同的lengthpattern参数进行各种此类组合以创建唯一的ID。


0
投票

您可以使用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"   
© www.soinside.com 2019 - 2024. All rights reserved.