计算R中矩阵的成对差异数

时间:2015-03-14 03:26:43

标签: r matrix

我有以下矩阵:

0 1 0 0 0 1 0 0   # Row A
0 1 0 0 0 0 1 0   # Row B
0 1 0 0 0 0 0 0   # Row C
0 0 1 0 0 0 0 0   # Row D

我想创建一个新矩阵,显示每行之间的成对差异(例如,在行A和B之间,有2列不同,因此矩阵中对应于A和B的条目是2)。像这样:

   A B C D
A  - 2 1 3
B  - - 1 3
C  - - - 2
D  - - - -

矩阵并非绝对必要。它只是我真正想做的中间步骤:计算原始矩阵中每一行之间的成对差异的数量,如此...

(2 + 1 + 3 + 1 + 3 + 2)= 12

2 个答案:

答案 0 :(得分:3)

您可以尝试combn

 v1 <- combn(1:nrow(m1), 2, FUN=function(x) sum(m1[x[1],]!= m1[x[2],]))
 v1 
 #[1] 2 1 3 1 3 2
 sum(v1)
 #[1] 12

如果您需要matrix输出

m2 <- outer(1:nrow(m1), 1:nrow(m1), FUN=Vectorize(function(x,y)
           sum(m1[x,]!=m1[y,])))

dimnames(m2) <- rep(list(LETTERS[1:4]),2)
m2[lower.tri(m2)] <- 0
m2
#  A B C D
#A 0 2 1 3
#B 0 0 1 3
#C 0 0 0 2
#D 0 0 0 0

数据

 m1 <- structure(c(0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 
 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 
 0L, 0L, 0L), .Dim = c(4L, 8L))

答案 1 :(得分:0)

我认为这个功能可以帮助你计算差异

count.diff <- function(mat) {
  Nrow <- nrow(mat)
  count <- 0
  for (i in 1:(Nrow-1)) count <- count + sum(t(t(mat[-(1:i),])!=mat[i,]))
  count
}

mat <- matrix(rbinom(n=24,size=1,prob=0.7), ncol=4)
mat
count.diff(mat)