为了保护研究对象在数据集中不被识别,我对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