我有患者ID的数据和这些患者接受治疗的医院。我想计算Jaccard相似度。以下是样本数据。
HospitalID CustID
1 1
2 1
1 2
4 2
1 3
2 3
3 3
Jaccard Index for (Hospital1,Hospital2) = No. of patients treated by H1 and H2 / Union of patients treated by H1 and H2
的计算。它将是2 /(3 + 2-2)。我需要为所有医院组合计算它,即(H1,H2)(H1,H3)(H1,H4)(H2,H4)(H3,H4)。
在真实数据集中,我有超过2000家医院和100K被保险人的数据。 R中有许多可用于计算Jaccard距离的软件包但我必须转换数据并将保险ID放在不可行的列中,因为有超过100K的保险。示例R数据集如下所示 -
dt = read.table(header = TRUE,
text ="HospitalID CustID
1 1
2 1
1 2
3 2
1 3
2 3
3 3
")
输出应如下所示 -
Comb1 Comb2 Score
H1 H2 0.67
H1 H3 some_value
H1 H4 some_value
H2 H3 some_value
H2 H4 some_value
H3 H4 some_value
答案 0 :(得分:2)
这是一个非常直接的基础R解决方案:
uniHosp <- unique(dt$HospitalID)
myCombs <- combn(uniHosp, 2)
myOut <- data.frame(Comb1 = paste0("H", myCombs[1, ]),
Comb2 = paste0("H", myCombs[2, ]),
stringsAsFactors = FALSE)
myHosp <- dt$HospitalID
myCust <- dt$CustID
myOut$Jaccard <- sapply(1:ncol(myCombs), function(x) {
inA <- myCust[myHosp == myCombs[1, x]]
inB <- myCust[myHosp == myCombs[2, x]]
length(intersect(inA, inB))/length(union(inA, inB))
})
myOut
Comb1 Comb2 Jaccard
1 H1 H2 0.6666667
2 H1 H3 0.6666667
3 H2 H3 0.3333333
使用data.table
或dplyr
的方法可能要快得多,但上述方法可以让您从正确的方向着手。