查找相同矩阵的计数并忽略矩阵中存在的NA

时间:2015-08-13 06:16:16

标签: r matrix

我有一个矩阵(V),看起来像这样

       [,1] [,2] [,3]
[V1,]    37   15   NA
[V2,]    44   31   NA
[V3,]    NA   37   56

当[V1,]与自身进行比较时,计数为2,因为两个数字匹配。

当[V1,]与[V2,]进行比较时,计数为0,因为没有数字匹配。

现在,矩阵V的每一行应与自身(V)匹配,以得到像

这样的计数矩阵
     [,V1] [,V2] [,V3]
[V1,]    2     0     1
[V2,]    0     2     0
[V3,]    1     0     2

因此,它是计算向量中非NA的元素数。

检查两个相同矩阵之间的计数(V == V)?

我在这里发布了几乎相同的问题

Finding pattern in one matrix to another matrix in R

但我不知道在不计算矩阵中NA的情况下如何做同样的事情?

我如何使用R?

4 个答案:

答案 0 :(得分:4)

这给出了期望的结果:

mat2 <- V
for(i in 1:nrow(V)){
  for (j in 1:nrow(V)) mat2[i,j] <- sum(na.omit(V[i,]) %in% (na.omit(V[j,])))
}
> mat2
#     [,1] [,2] [,3]
#[1,]    2    0    1
#[2,]    0    2    0
#[3,]    1    0    2

数据

V <- matrix(c(37,15,NA,44,31,NA,NA,37,56),ncol=3, byrow=T)

答案 1 :(得分:3)

另一种选择是将行索引用作outer中的'X'和'Y'参数,Vectorize操作,subset基于索引的'V'行,检查比较的行中是否存在非NA(na.omit)元素(%in%),并获取sum。输出为matrixlength的输出取决于prod(dim(V))

 outer(1:nrow(V), 1:nrow(V), 
    FUN=Vectorize(function(i, j) sum(na.omit(V[i,]) %in% na.omit(V[j,]))) )
 #     [,1] [,2] [,3]
 #[1,]    2    0    1
 #[2,]    0    2    0
 #[3,]    1    0    2

数据

  V <- matrix(c(37,44, NA, 15, 31, 37, NA, NA, 56), ncol=3)

答案 2 :(得分:2)

您可以使用以下代码来获取两行中匹配元素的数量,不包括NAs ......

length(na.omit(intersect(V[i,],v[j,])))

您可以将其放入循环中以生成矩阵。

答案 3 :(得分:2)

你也可以选择一个好的旧双重申请:

V <- matrix(c(37, 15, NA, 44, 31, NA, NA, 37, 76), 3, byrow = TRUE)
compare <- function(V1, V2) sum(na.omit(V1) %in% na.omit(V2))
apply(V, 1, function(V1) apply(V, 1, function(V2) compare(V1, V2)))