2016-10-31 8 views
0

私は科学論文のカップルの間の近接度を計算しようとしています。論文Aの著者の2人がアムステルダムに、1人がニューヨークに住んでいて、論文Bの著者の3人がアムステルダムに住んでいるとき、私は結果を3 + 2 = 5にしたい。私は2つの大きな行列を持っています。列は論文を表し、行は都市を表します。2つの行列のオーバーラップを合計する

行列A:

     A1  A2 

DAVIS、CA USA                                           0例えば。
LOS ANGELES、CA USA            。           PALO ALTO、                      CA USA。           サクラメント、CA USA                  。
サンタモニカ、カリフォルニアアメリカ         。          

とMatrixB:

      B1 

DAVIS、CA USA                                   LOS ANGELES、CA USA           パロアルト、CA USA                        。
サクラメント、CA USA           サンタモニカ、CA USA        

2(行列A%※%のT(MatrixB))ののCrossProductものに近づきますが欲しいです。これは、A2-B1のために、私を与えるだろう

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

しかし私が欲しいのです:

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

ので、乗算1だとき0、elseを追加します。これを達成するための効率的な(!)方法はありますか?

+1

データセットをフォーマットしてください – akrun

+0

matrixAは5 * 2とt(matri xB)が1 * 5であることを意味します(MatrixA%*%t(MatrixB))。 – cryptomanic

+0

@cryptomanic本当です。 crossprod(x = MatrixA、y = MatrixB)が行います。 –

答えて

0

あなたがしなければならないのは、その後、NAであなたのAB行列に0年代を交換する最初のものですにそれらを追加し、colSumsna.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