0

我正在尝试计算几篇科学论文之间的接近度。当论文 A 的 2 位作者住在阿姆斯特丹,1 位在纽约,而论文 B 的 3 位作者住在阿姆斯特丹时,我希望结果为 3+2=5。我有两个大矩阵,其中列代表论文,行代表城市。例如:

矩阵A:

                       A1      A2

美国加利福尼亚州戴维斯市 4 .
美国加利福尼亚州洛杉矶。1
美国加利福尼亚州帕洛阿尔托。1
美国加利福尼亚州萨克拉门托 2 .
美国加利福尼亚州圣莫尼卡。2

和矩阵B:

                         B1

美国加利福尼亚州戴维斯 1 美国加利福尼亚州
洛杉矶 2 美国加利福尼亚州
帕洛阿尔托。
美国加利福尼亚州萨克拉门托 1 美国加利福尼亚州
圣莫尼卡 2

两者的叉积 (MatrixA %*% t(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?

4

1 回答 1

0

您所要做的就是首先将您的和矩阵0中的 's替换为,然后添加它们并执行 a with :ABNAcolSumsna.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
于 2016-10-31T11:12:14.170 回答