R:如何将列中的值替换为具有重复项的随机数



我有一个包含数据的df,以及每行的名称。当一个名字出现两次或两次以上时,我希望这些名字被一个随机的字符串/数字取代,但使用相同的字符串(例如下面的Adam和Camille(。

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是否保证返回唯一值——它们只是随机值。虽然不太可能是相同的,但通过首先创建翻译表,可以更容易地检查它们是否都是不同的。

最新更新