【问题标题】:How to generate IDs for each participant in R如何为 R 中的每个参与者生成 ID
【发布时间】:2021-10-13 22:04:36
【问题描述】:

我有大约 10,000 名患者的医疗数据。我想用每个患者的唯一 ID 替换他们的 ID/社会安全号码 (Patient_SSN)。请注意,某些行具有相同的参与者 SSN,这是因为数据存储在访问级别。换句话说,每次访问都存储在一个新行中(即具有不同的日期),例如 'Mary' 和 'John' 数据。

Patient_Name = c("Alex", "Mary", "Sarah", "John", "Susan", "Jessica", "Sarah", "Karen", "Mary", "John")
Patient_SSN  =  c(1234,    43251,    9320,    2901,  3229,     4291,     9320,    9218988,    43251 ,  2901)
Visit_Date   =  c('10_21', '10_21',  '10_25', '10_25','10_26','10_27','10_28','10_28','10_28' ,'10_29')
BMI = runif(10, min=12, max =25);

data_hospital = data.frame(Patient_Name, Patient_SSN, BMI, Visit_Date)

我的问题是:如何用新 ID 替换每个 SSN 以保护参与者隐私,但请记住,有些行具有相同的 SSN?新 SSN/ID 的字符长度应与原始 Patient_SSN 字符的长度相同。提前感谢您的帮助。

【问题讨论】:

  • 这篇文章只显示单个数字(似乎是序列),而不是随机数字 - 如果可能的话,我正在寻找相同长度的 Patient_SSN。谢谢。
  • data_hospital %>% mutate(NEW_ID = sample(5000)[group_indices(.,Patient_SSN)])
  • 我更新了答案,使 Patient_SSN 与 newid 的比例为 1:1,并且长度匹配。

标签: r


【解决方案1】:

dplyr 有一个功能!查看?group_data:

library(dplyr)
data_hospital$newid <- data_hospital %>% group_indices(Patient_SSN)

   Patient_Name Patient_SSN      BMI Visit_Date newid
1          Alex        1234 21.70192      10_21     1
2          Mary       43251 18.75820      10_21     6
3         Sarah        9320 22.84921      10_25     5
4          John        2901 19.94831      10_25     2
5         Susan        3229 20.27007      10_26     3
6       Jessica        4291 14.39934      10_27     4
7         Sarah        9320 16.65728      10_28     5
8         Karen     9218988 17.99142      10_28     7
9          Mary       43251 20.71236      10_28     6
10         John        2901 12.67764      10_29     2

编辑:基于@Bloxx 和 Tjn25 的好主意

data_hospital %>%
  group_by(Patient_SSN) %>%
  mutate(id = paste(sample(0:9, nchar(Patient_SSN), replace=TRUE), collapse=""))

# A tibble: 10 x 5
# Groups:   Patient_SSN [7]
   Patient_Name Patient_SSN   BMI Visit_Date id     
   <chr>              <dbl> <dbl> <chr>      <chr>  
 1 Alex                1234  12.1 10_21      7076   
 2 Mary               43251  17.3 10_21      04734  
 3 Sarah               9320  14.6 10_25      0161   
 4 John                2901  15.5 10_25      9063   
 5 Susan               3229  23.3 10_26      5817   
 6 Jessica             4291  17.1 10_27      1791   
 7 Sarah               9320  23.3 10_28      0161   
 8 Karen            9218988  23.7 10_28      8627443
 9 Mary               43251  23.1 10_28      04734  
10 John                2901  20.0 10_29      9063 

【讨论】:

  • 谢谢@Skaqqs - 我刚刚编辑了这个问题。
【解决方案2】:

如果您希望保持Pateint_SSN 的长度,一种方法是生成一个介于0 和1 之间的随机数,并将其乘以10^(length_of_number)

这并不能保证它们是唯一的 ID,因此您需要检查它并在有重复但不太可能发生的情况下生成新编号。

library(dplyr)
data_hospital <- data_hospital %>% mutate(id_length = nchar(Patient_SSN))
data_hospital$random_number <- runif(n = nrow(data_hospital),min = 0, max = 1)
data_hospital <- data_hospital %>% mutate(new_id = round(random_number*10^id_length))

【讨论】:

  • 此方法有效,但存在科学问题。随机化意味着您将跟踪移回原始位置。通过保持原件的长度,人们可以追溯。尤其是在使用患者数据时,民族健康评估不会接受这一点。
  • @Bloxx 有没有办法避免回溯并保持原始长度?这是在问题中指定的。
  • 当然,您不会从原始变量中获得任何特征。我认为 sample() 可以解决问题...尝试我在原始问题下的评论中发布的代码。您可以更改示例函数中的数字...在这种情况下,原始 SSN 中唯一的“功能”是 uniqnes...以便为每个唯一值分配一个随机数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 2016-07-02
相关资源
最近更新 更多