【问题标题】:R: How to replace values in column with random numbers WITH duplicatesR:如何用重复的随机数替换列中的值
【发布时间】:2021-04-01 11:21:23
【问题描述】:

我有一个包含数据的 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]'))))

【问题讨论】:

  • 您这样做是为了匿名数据吗?如果是这样,您还可以查看“digest”和“anonymizer”包。
  • 是的,这就是目的。谢谢,我不知道那些包!

标签: r dataframe random replace dplyr


【解决方案1】:

一种方法是使用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 是否保证返回唯一值——它们只是随机值。虽然不太可能相同,但通过首先创建转换表来检查它们是否都不同会更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-19
    • 2021-03-26
    • 1970-01-01
    • 2018-04-03
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多