我有大约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))