如何以一种在R中生成人类可读输出的方式对矢量进行匿名化?

时间:2018-03-15 19:12:37

标签: r hash cryptography anonymize

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

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

3 个答案:

答案 0 :(得分:2)

如何为每个主题分配一个随机数:

$('.dropdown-menu').on('shown.bs.collapse', function(e) {
    alert("Close");
});

然后,您可以使用引用Mark的数据来讨论主题4.

如果您想要与受试者数量无关的数字:

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

答案 1 :(得分:1)

只需使用人类可读名称的参考列表,并将其与真实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。

答案 2 :(得分:0)

获取哈希的前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