我很惊讶这个问题没有被问到,也许答案会清楚为什么。我想比较矩阵的行和向量,并返回行==向量到处。请参阅下面的示例。我想要一个矢量化解决方案,没有应用函数,因为矩阵对于慢循环来说太大了。假设还有很多行,所以我想避免重复使用向量。
set.seed(1)
M = matrix(rpois(50,5),5,10)
v = c(3 , 2 , 7 , 7 , 4 , 4 , 7 , 4 , 5, 6)
M
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 4 8 3 5 9 4 5 6 7 7
[2,] 4 9 3 6 3 1 5 7 6 1
[3,] 5 6 6 11 6 4 5 2 7 5
[4,] 8 6 4 4 3 8 3 6 5 6
[5,] 3 2 7 7 4 4 7 4 5 6
输出应为
FALSE FALSE FALSE FALSE TRUE
答案 0 :(得分:7)
一种可能性是
rowSums(M == v[col(M)]) == ncol(M)
## [1] FALSE FALSE FALSE FALSE TRUE
或者类似地
rowSums(M == rep(v, each = nrow(M))) == ncol(M)
## [1] FALSE FALSE FALSE FALSE TRUE
或
colSums(t(M) == v) == ncol(M)
## [1] FALSE FALSE FALSE FALSE TRUE
v[col(M)]
只是rep(v, each = nrow(M))
的缩短版本,可以创建与M
大小相同的向量(矩阵只是一个向量,尝试c(M)
),然后比较每个使用==
对应其相应的元素。幸运的是,==
是一个通用函数,它具有array
方法(请参阅methods("Ops")
和is.array(M)
),它允许我们运行rowSums
(或colSums
)以确保我们的匹配数量为ncol(M)
答案 1 :(得分:4)
使用DeMorgan的规则(Not not = Some not),然后All equal = Not Some Not equal,我们也有
!colSums(t(M) != v)
答案 2 :(得分:0)
包prodlim
有一个名为row.match
的功能,它易于使用,非常适合您的问题。首先安装并加载库:library(prodlim)
。在我们的示例中,row.match
将返回' 5'因为M
中的第5行等于v
。然后我们可以将其转换为逻辑向量。
m <- row.match(v, M)
m==1:NROW(M)#[1] FALSE FALSE FALSE FALSE TRUE