让我们有这个数据
> 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/