我在创建406351个边的边列表(在902个唯一节点中可能是两个节点的组合)时遇到问题。节点对应于医生,边缘对应于在一段时间(一年)中两个节点共享的患者数量。
我有医疗要求数据,其中一项观察结果是一名患者一次拜访特定医生。
到目前为止,对我有用的是:首先,将医生和病人的身份证对照起来,以获取每个病人对每个医生的拜访次数。之后,我获取了唯一的医生ID列表,并创建了包含所有可能的2种元素组合的边缘列表。最后,我用for循环“填充”边缘列表,该循环查看表中各列(医生)的每种组合,并计算出有多少特定患者的这两列(医生)的就诊次数均大于0。
这可行,但是我的问题是循环太慢,我想知道是否有更快的方法。
这是到目前为止我的方法的一个示例:
#DATA
case_number<-c("123","3456","5433","5678","9874","8566")
doctor_id<-c("333","444","555","333","666","555")
patient_id<-c("1","2","1","1")
DATA<-data.frame(case_number,doctor_id,patient_id)
#Table doc vs patients
table<- as.data.table(as.data.frame.matrix(table(DATA$patient_id,DATA$doctor_id)))
#Create edge list
Drs<-unique(DATA$doctor_id)
edge_list<-as.data.table(t(combn(as.vector(unique(Drs)),2)))
#'fill up' edge list
for (z in colnames(table)) {
for (y in colnames(table)) {
edge_list<-edge_list[(V1==z & V2==y) | (V2==z & V1==y),Weight:=nrow(table[table[[z]]>0 & table[[y]]>0])]}}