我正在尝试计算科学论文之间的邻近度量。当论文A的两位作者居住在阿姆斯特丹,1位居住在纽约,而论文B的三位作者居住在阿姆斯特丹,我希望结果为3 + 2 = 5。我有两个大矩阵,其中列代表论文,行代表城市。例如:
矩阵matrixA:
A1 A2
美国加利福尼亚州戴维斯4。
美国加利福尼亚州洛杉矶。 1
PALO ALTO,CA USA。 1
美国加利福尼亚州萨克拉门托2。
美国加利福尼亚州圣塔莫尼卡。 2
和MatrixB:
B1
美国加利福尼亚州戴维斯1
美国加利福尼亚州洛杉矶2
PALO ALTO,CA USA。
美国加利福尼亚州萨克拉门托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?
答案 0 :(得分: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
数据:强>
int b = foo(1); // returns 0x1
int c = foo(2); // returns 0x2