2016-10-31 4 views
0

Я пытаюсь вычислить меры близости между парами научных статей. Когда 2 автора бумаги A живут в Амстердаме и 1 в Нью-Йорке, а 3 автора газеты B живут в Амстердаме, я хочу, чтобы результат был 3 + 2 = 5. У меня две большие матрицы, где столбцы представляют собой бумаги и строки, представляющие города. Например:суммирование перекрытия в двух матрицах

: матрицы А

     A1  A2 

Дэвис, Калифорния, США                                            .
LOS ANGELES, CA USA            .           Пало-Альто, Калифорния, США                      .           Sacramento, Калифорния, США                  .
SANTA MONICA, CA USA          .          

и MatrixB:

      B1 

DAVIS, Калифорния, США                                   Лос-Анджелес, Калифорния, США           Пало-Альто, Калифорния, США                        .
Сакраменто, Калифорния, США           SANTA MONICA, CA USA        

векторное произведение из двух (матрицы А% *% т (MatrixB)) приближается к тому, что Я хочу. Это было бы дать мне, для A2-B1,

(0 * 1) + (1 * 2) + (1 * 0) + (0 * 1) + (2 * 2) = 6

но то, что я хочу это:

(0 * 1) + (1 + 2) + (1 * 0) + (0 * 1) + (2 + 2) = 7

Так размножаются, когда один это 0, иначе добавить. Есть ли эффективный (!) Способ достичь этого, используя R?

+1

Отформатируйте свои наборы данных – akrun

+0

matrixA is 5 * 2 и t (matri xB) составляет 1 * 5, это означает (MatrixA% *% t (MatrixB)) выдает ошибку. – cryptomanic

+0

@ криптомании True. crossprod (x = MatrixA, y = MatrixB). –

ответ

0

Все, что вам нужно сделать, это первое, чтобы заменить 0 в твоих A и B матриц с NA, то добавить их и сделать colSums с na.rm=TRUE:

A[A==0] <- NA 
B[B==0] <- NA 

## I'm assuming that you want to compare B to all columns of A 
C <- colSums(A + rep(B,ncol(A)), na.rm=TRUE) 
## A1 A2 
## 8 7 

данных:

A <- structure(c(4, 0, 0, 2, 0, 0, 1, 1, 0, 2), .Dim = c(5L, 
2L), .Dimnames = list(NULL, c("A1", "A2"))) 
##  A1 A2 
##[1,] 4 0 
##[2,] 0 1 
##[3,] 0 1 
##[4,] 2 0 
##[5,] 0 2 

B <- structure(c(1, 2, 0, 1, 2), .Dim = c(5L, 1L), .Dimnames = list(
    NULL, "B1")) 
##  B1 
##[1,] 1 
##[2,] 2 
##[3,] 0 
##[4,] 1 
##[5,] 2 
Смежные вопросы