Визуализируйте пересечение фреймов данных в таблице или матрице - PullRequest
2 голосов
/ 24 мая 2019

У меня есть три кадра данных, и я хочу визуализировать пересечение между собой.

Скажем, у меня есть три кадра данных, как показано ниже:

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 и ищу способ, чтобы было легче увидеть пересечения.В конечном итоге я могу работать с большим количеством фреймов данных и хотел бы, чтобы решение могло масштабироваться.

Мне было интересно, есть ли способ отобразить пересечение в таблице или матрице, как показано ниже:

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

Возможно ли это?Еще лучше, есть ли решение, которое делает его красивым в RMD или совместимым с knitr::kable?

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Отложив на мгновение мой комментарий, вы сможете использовать ?outer для полуавтоматической генерации желаемой матрицы. Возьмите эти 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
2 голосов
/ 24 мая 2019

Для этого может существовать пакет, но его также легко создать самостоятельно:

Учитывая ваши номера:

#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
...