我有一个矩阵(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?
答案 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
。输出为matrix
,length
的输出取决于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)))