Генерация уникальной случайной строки в R с использованием stringi - PullRequest
0 голосов
/ 04 октября 2019

У меня есть данные, где в каждой строке указан человек. Я хочу создать случайно сгенерированный уникальный идентификатор, чтобы я мог идентифицировать их при анализе.

Вот примерный кадр данных

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)
)

Чтобы сгенерировать уникальный идентификатор, я использую 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")])))

Есть ли способ создать уникальный идентификатор, который действительно уникален, без дубликатов?

Я видел эти вопросы, но он не отвечает, как сделать случайныйсгенерированный номер уникален. Генерация уникальных случайных чисел в столбце данных в R Создание кадра данных со случайными числами в каждом столбце

Спасибо

Ответы [ 3 ]

3 голосов
/ 04 октября 2019

Вы можете использовать пакет ids для автоматического создания уникальных идентификаторов. Например, чтобы сделать 10 миллионов идентификаторов пользователей, вы можете использовать:

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, которая создает идентификаторы, которые людям легче различать и запоминать.

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"   
1 голос
/ 04 октября 2019

Возможно, это не то, что вы хотите, но, используя свой собственный скрипт, вы всегда можете сгенерировать больший вектор случайных строк (скажем, 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")])))
0 голосов
/ 04 октября 2019

Генерация случайных строк может привести к дубликатам, одна вещь, которую мы можем сделать, - сделать случайные строки с правилами достаточно сложными, чтобы вероятность появления дубликатов стала действительно небольшой. Например, объедините две случайные строки, чтобы получить уникальный ID, например

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

. Это значительно снижает вероятность дублирования UniqueID. Вы можете попробовать различные такие комбинации с разными аргументами length и pattern для создания уникальных идентификаторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...