У меня есть df с данными и имя для каждой строки. Я хотел бы, чтобы имена были заменены случайной строкой/числом, но с той же строкой, когда имя появляется дважды или более (например, для Адама и Камиллы ниже).
df <- data.frame("name" = c("Adam", "Adam", "Billy", "Camille", "Camille", "Dennis"), "favourite food" = c("Apples", "Banana", "Oranges", "Banana", "Apples", "Oranges"), stringsAsFactors = F)
Ожидаемый результат примерно такой (не важно, как выглядит случайная строка или ее длина)
df_exp <- data.frame("name" = c("xxyz", "xxyz", "xyyz", "xyzz", "xyzz", "yyzz"), "favourite food" = c("Apples", "Banana", "Oranges", "Banana", "Apples", "Oranges"), stringsAsFactors = F)
Я пробовал несколько функций случайной замены в R, однако каждая из них создает случайную строку для каждой строки данных, а не отдельную для дубликатов, например. stri_rand_strings:
library(stringi)
library(magrittr)
library(tidyr)
library(dplyr)
df <- df %>%
mutate(UniqueID = do.call(paste0, Map(stri_rand_strings, n=6, length=c(2, 6),
pattern = c('[A-Z]', '[0-9]'))))
Да, это цель. Спасибо, я не знал этих пакетов!
Один из способов - с group_by/mutate
df %>%
group_by(name) %>%
mutate(hidden = stringi::stri_rand_strings(1, length=4)) %>%
ungroup() %>%
mutate(name=hidden)
По сути, мы просто генерируем одну случайную строку для каждой группы.
Вы также можете сначала создать таблицу перевода с помощью чего-то вроде
new_names <- df %>%
distinct(name) %>%
mutate(new_name = stringi::stri_rand_strings(n(), length=c(2,6)))
а затем объединить это с исходными данными. Но в любом случае я не уверен, что stri_rand_strings
гарантированно возвращает уникальные значения — это просто случайные значения. Хотя маловероятно, что это одно и то же, было бы проще проверить, что все они различны, сначала создав таблицу перевода.
Вы делаете это для анонимизации данных? Если это так, вы также можете посмотреть на пакеты «дайджест» и «анонимайзер».