可视化 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
我有三个数据框,我想可视化彼此之间的交集。
假设我有如下所示的三个数据框:
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