如何在交集和并集的R矩阵中进行分类?

tom*_*ujo 5 r

让我们有这个数据

> 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Rob*_*ach 8

也许是这样的吗?

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
Run Code Online (Sandbox Code Playgroud)

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

  • 未向量化的 `f` 不能在提供给它的向量上正确运行(其中的函数也可以使用向量,`f` 只是传递向量)。`Vectorize` 基本上为 x 和 y 的每个元素将函数包装到 `sapply` 中,应用回收规则等,以便使用标量参数调用每个调用。 (2认同)