我在创建 406351 个边的边列表时遇到问题(902 个唯一节点中的两个节点的可能组合)。节点对应医生,边对应两个节点在一段时间(一年)内共享的患者数量。
我有医疗索赔数据,其中一项观察是一名患者对特定医生的一次访问。
到目前为止,对我有用的是:首先,将医生与患者的 ID 对照,获取每位患者与每位医生的就诊次数。之后,我获取了唯一医生 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","2","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])]}}