如何为r中的每个参与者生成id

  • 本文关键字:参与者 id r
  • 更新时间 :
  • 英文 :


我有大约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的字符长度相同。事先感谢您的协助。

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 

如果您想要保持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))

最新更新