如何基于R tibble现有列值新增匹配的匿名ID列
问题原因
你写的apply(data, 1, function(x) {random_id(bytes=5)} )是按行遍历执行,每运行一次就生成一个新的随机ID,所以同一个参与者的不同行自然会拿到不同的ID,不符合你的需求。
实现思路
核心逻辑是先给所有唯一的原身份ID分配一一对应的随机ID,生成一份映射表,再把映射结果匹配回原数据集的所有行,就能保证同一个参与者的所有行对应同一个匿名ID。
具体实现代码
方法1:tidyverse(适配tibble的常用写法)
首先加载依赖包:
library(dplyr) library(ids)
- 生成原ID与匿名ID的映射表
# 请将代码中的 original_id 替换为你实际存储可识别身份ID的列名 id_mapping <- data %>% distinct(original_id) %>% # 提取所有不重复的参与者原ID mutate(anon_id = random_id(n = n(), bytes = 5)) # 给每个唯一ID分配对应随机ID
- 把匿名ID匹配回原数据集
data <- data %>% left_join(id_mapping, by = "original_id")
如果需要删除原可识别ID,后续直接使用匿名ID,可以再加一步:
data <- data %>% select(-original_id)
方法2:Base R写法
不需要额外加载dplyr也可以实现:
# 提取所有唯一原ID unique_original_ids <- unique(data$original_id) # 生成对应数量的随机ID anon_ids <- random_id(n = length(unique_original_ids), bytes = 5) # 匹配回原数据的每一行 data$anon_id <- anon_ids[match(data$original_id, unique_original_ids)]
注意事项
- 如果后续需要回溯原ID和匿名ID的对应关系,可以把
id_mapping单独存储在加密的安全位置,不要和匿名后的公开数据集一起发布 - 运行前请将示例代码中的
original_id替换为你实际的ID列名
内容的提问来源于stack exchange,提问作者shleen
相关产品推荐
相关产品推荐

