таблица общих элементов между образцами - PullRequest
0 голосов
/ 04 мая 2020

У меня есть 6 различных векторов с именем, сохраненным в них.
Я хочу отобразить таблицу со столбцами и строками каждого вектора, где пересечение является количеством элементов, общих для каждого из них.

для примера в качестве ввода:

a <- c('tom','john','phil')  
b <- c('phil','leo','james')  
d <- c('tom','john', 'dan')

Вывод:

  a  b  d  
a 3     
b 1  3 
d 2  0  3

с в каждой ячейке sum(rowname %in% colname)

Есть ли способ?

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

Это может быть излишним, но должно работать достаточно быстро с большими данными.

Шаги:

  1. Создать матрицу элементов документа с помощью quanteda
  2. Выполнение умножения матриц
library(quanteda)
library(dplyr)
a <- c('tom','john','phil')  
b <- c('phil','leo','james')  
d <- c('tom','john', 'dan')

feature_matrix <- list(a, b, d) %>% as.tokens %>% dfm
feature_matrix
#> Document-feature matrix of: 3 documents, 6 features (50.0% sparse).
#>        features
#> docs    tom john phil leo james dan
#>   text1   1    1    1   0     0   0
#>   text2   0    0    1   1     1   0
#>   text3   1    1    0   0     0   1
feature_matrix %*% t(feature_matrix)
#> 3 x 3 sparse Matrix of class "dgCMatrix"
#>       text1 text2 text3
#> text1     3     1     2
#> text2     1     3     .
#> text3     2     .     3

Создано в 2020-05-04 пакетом Представить (v0.3.0)

Последний шаг, чтобы получить точно такой же результат:

library(Matrix)
feature_matrix %*% t(feature_matrix) %>% tril() %>% as.matrix()
#>       text1 text2 text3
#> text1     3     0     0
#> text2     1     3     0
#> text3     2     0     3
1 голос
/ 04 мая 2020

Всегда есть способ. наименее элегантное решение - это, вероятно, два вложенных цикла for. Не элегантно, но легко читается. Но не очень быстро.

all <- numeric(0)
a <- c('tom','john','phil')  
b <- c('phil','leo','james')  
d <- c('tom','john', 'dan')
for(v1 in list(a, b, d))
  for(v2 in list(a, b, d)) {
    all <- c(all, sum((v1) %in% (v2)))
    print(v2)
  }
dim(all) <- rep(3, 2)
all[upper.tri(all)] <- NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...