4

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

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

4

3 回答 3

2

为每个主题分配一个随机数怎么样:

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

然后你可以用提到 Mark 的数据来讨论主题 4。

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

sample(1000, length(subjects)) # [1] 789 103 435 983
于 2018-03-15T19:29:28.703 回答
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 来换取名字。

于 2018-03-15T19:43:15.857 回答
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
于 2018-03-15T19:32:23.600 回答