让我们有这个数据

> allt <- data.frame(day = rep(c("mon", "tue", "wed"), each =3), id = c(1:3,2:4,3:5))
> allt
  day id
1 mon  1
2 mon  2
3 mon  3
4 tue  2
5 tue  3
6 tue  4
7 wed  3
8 wed  4
9 wed  5

在最后的数据框中,我们可以看到,对于“星期一”,我们有id [1,2,3],对于“星期二”,我们有id [2,3,4]。因此,如果我们使这些向量相交,则我们将得到[2,3],如果我们使它们并集,那么将得到[1,2,3,4]。这些向量的长度分别为2和4,比率为0.5。那就是我想要的电话号码。

因此,我正在寻找一种通用的方法,如何针对所有可能的组合在更多类别中获得该比率。

结果可能是类似相关矩阵的格式。为了清楚起见,我对2个类别的交叉点和并集感兴趣,因此例如,我不需要4路交叉点(周一,周二,周三,周四)-仅需要2天的交叉点。

最佳答案

也许是这样的吗?

days <- levels(allt$day)

f <- function(x, y) {
  xids <- allt$id[allt$day == x]
  yids <- allt$id[allt$day == y]
  length(intersect(xids, yids)) / length(union(xids, yids))
}
f <- Vectorize(f)

outer(days, days, f)

#      [,1] [,2] [,3]
# [1,]  1.0  0.5  0.2
# [2,]  0.5  1.0  0.5
# [3,]  0.2  0.5  1.0

(可选)通过管道将其传输到set_colnames(days)set_rownames(days)

关于r - 如何在类别的交集和并集的R矩阵中制作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55829226/

10-15 23:28