使用 stringi 在 R 中生成唯一的随机字符串
Generate a unique random string in R using stringi
我有数据,其中每一行都是一个人。我想做一个随机生成的唯一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 R
Create a dataframe with random numbers in each column
谢谢
生成随机字符串会导致重复,我们可以做的一件事是让随机字符串的规则足够复杂,这样重复出现的概率就会变得非常小。例如,将两个随机字符串组合成一个唯一的 ID
like
library(stringi)
df$UniqueID <- paste0(stri_rand_strings(5000, 2, '[A-Z]'),
stri_rand_strings(5000, 6,'[0-9]'))
这大大降低了 UniqueID
被重复的可能性。您可以使用不同的 length
和 pattern
参数尝试各种此类组合来创建唯一 ID。
您可以使用 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"
这可能不是您想要的,但使用您自己的脚本,您始终可以生成更大的随机字符串向量(例如 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")])))
我有数据,其中每一行都是一个人。我想做一个随机生成的唯一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 R Create a dataframe with random numbers in each column
谢谢
生成随机字符串会导致重复,我们可以做的一件事是让随机字符串的规则足够复杂,这样重复出现的概率就会变得非常小。例如,将两个随机字符串组合成一个唯一的 ID
like
library(stringi)
df$UniqueID <- paste0(stri_rand_strings(5000, 2, '[A-Z]'),
stri_rand_strings(5000, 6,'[0-9]'))
这大大降低了 UniqueID
被重复的可能性。您可以使用不同的 length
和 pattern
参数尝试各种此类组合来创建唯一 ID。
您可以使用 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"
这可能不是您想要的,但使用您自己的脚本,您始终可以生成更大的随机字符串向量(例如 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")])))