R

时间:2018-06-05 19:25:05

标签: r dplyr

我有患者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

1 个答案:

答案 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.tabledplyr的方法可能要快得多,但上述方法可以让您从正确的方向着手。