如何以在 R 中生成人类可读输出的方式匿名化向量



为了保护研究对象在数据集中不被识别,我对R中的匿名向量感兴趣。但是,我也希望在撰写研究时能够参考输出(例如"主题 [随机 ID] 显示......"(。我发现我可以使用匿名器包轻松生成短哈希,但是虽然在写作中引用短哈希是可行的,但它并不完全理想(例如"主题 f4d35fab 显示......"很难记住,有点拗口,并且很难区分其他散列数据,例如"来自 8b3bd334 的受试者 f4d35fab 显示......"(。

有没有办法将哈希转换为人类可读的随机字符串,或者甚至以非加密为中心的方式匿名化数据?

给每个受试者分配一个随机数怎么样:

> subjects <- c("Matthew", "Mark", "Luke", "John")
> subjects.anon <- sample(length(subjects))
> subjects.anon
[1] 1 4 2 3

然后你可以用引用马克的数据来谈论主题 4。

如果您想要与主题数量无关的数字:

sample(1000, length(subjects)) # [1] 789 103 435 983

只需使用人类可读名称的参考列表,并将其与真实ID的每个唯一值进行匹配。这实际上取决于您需要为其创建别名的值数量。

其中一个来源是婴儿名字列表(这里是 2010 年最常见的 1000 个名字(。例如

library(babynames)
library(dplyr)
samples <- data.frame(id=1:50, age=rnorm(50, 30, 5))    
translate <- babynames %>% filter(year==2010) %>% 
  top_n(1000, n) %>% 
  sample_n(length(unique(samples$id))) %>% 
  select(alias_id=name) %>%
  bind_cols(id=unique(samples$id))
translate
#     alias_id    id
#        <chr> <int>
#  1   Savanna     1
#  2    Jasmin     2
#  3   Natalie     3
#  4      Omar     4
#  5   Tristan     5
#  6  Jeremiah     6
#  7   Arielle     7
#  8    Tanner     8
#  9 Francesca     9
# 10     Devin    10
# # ... with 40 more rows

现在我们有一个转换表,可以用来交换名称的真实 ID。

取哈希的前 m 个字符,只要它在前 m 中是唯一的。 (m 的值趋向于 O(log(N((,其中 N 是主题数。下面是示例代码:

set.seed(1)
v <- do.call(paste0, replicate(n=8, sample(LETTERS, size=100, replace=T), simplify=F))
unique_in_first_m_chars <- function(v, m) {
  length(unique(substring(v, 1, m))) == length(v)
}
unique_in_first_m_chars(v, 4)
[1] TRUE
unique_in_first_m_chars(v, 3)
[1] FALSE
unique_in_first_m_chars(v, 2)
[1] FALSE

相关内容

  • 没有找到相关文章

最新更新