可视化 table 或矩阵中数据帧的交集

Visualize intersection of dataframes in table or matrix

我有三个数据框,我想可视化彼此之间的交集。

假设我有如下所示的三个数据框:

length(df1) 
length(df2) 
length(df3) 

[1] 283
[1] 290
[1] 295

我目前可以使用 intersect()

显示不同集合之间的交集
length(intersect(df1, df2)
length(intersect(df1, df3)
length(intersect(df2, df3)

[1] 96
[1] 227
[1] 98

虽然这给了我一个答案,但我正在使用 RMarkdown 并正在寻找一种更容易看到交叉点的方法。我最终可能会使用更多的数据帧,并且想要一个可以扩展的解决方案。

我想知道是否有办法在 table 或矩阵中显示交点,如图所示:

    | df1 | df2 | df3 |
----|-----|-----|-----|
df1 | 283 |  96 | 227 |
df2 |  96 | 290 |  98 |
df3 | 227 |  98 | 295 |

这可能吗?更好的是,有没有解决方案让它在 RMD 中看起来不错,或者兼容 knitr::kable?

可能有一个包可以做到这一点,但也很容易自己构建:

鉴于您的数字:

#your values
upper_lower <- c(96, 227, 98)
diagonal <- c(283, 290, 295)

#constructing the matrix
#make empty matrix
mat <- matrix(NA, ncol=3, nrow=3)
#add the values to the lower and upper matrix
mat[upper.tri(mat)] <- mat[lower.tri(mat)] <- upper_lower
#add the diagonal
diag(mat) <- diagonal
#give the names
colnames(mat) <- c('df1', 'df2', 'df3')
rownames(mat) <- c('df1', 'df2', 'df3')

结果:

mat
#    df1 df2 df3
#df1 283  96 227
#df2  96 290  98
#df3 227  98 295

暂时搁置我的评论,您应该能够使用 ?outer 生成您想要的矩阵输出 semi-automatically。以这3个向量为例:

v1 <- 1:8
v2 <- 4:9
v3 <- 6:12

ldf <- mget(c("v1","v2","v3"))
outer(ldf, ldf, FUN=function(x,y) lengths(Vectorize(intersect)(x,y)))
#   v1 v2 v3
#v1  8  5  3
#v2  5  6  4
#v3  3  4  7