将每个矩阵行与一个向量进行比较

4

我有一个3列的矩阵,想要将其行与向量进行比较。我知道最简单的方法是通过apply(table==vector,1,sum)>(length(vector)-1),但由于我一直得到错误的标记行,所以开始挖掘部分结果。下面是我的代码和R似乎出现的错误。

transition_matrix<-cbind(permutations(n=7,r=4,v=c(0,1,2,3,4,5,6),repeats.allowed=T),prob=0,n=1)
vector<-c(1,0,1)
table <- transition_matrix[,c(1:3)]
table[59,]
>0 1 1
(table==vector)[59,]
>TRUE TRUE TRUE

我现在只是困惑地盯着我的代码,实际上并不理解为什么它不能工作。我可能漏掉了某些东西,因为如果我直接将第59行与向量进行比较,我会得到正确的结果。


2
如果您执行了 (table[59,] == vector) 会怎样? - Valentin Ruano
2个回答

3
如Chi Pak所指出的,table == vector是按列操作,但你想将每一行与向量进行比较。
实现你想要的行为的一种方法是在与向量比较之前转置矩阵,然后重新转置。
样例数据:
(table <- matrix(rep(0:2, 4), 4))
#      [,1] [,2] [,3]
# [1,]    0    1    2
# [2,]    1    2    0
# [3,]    2    0    1
# [4,]    0    1    2

(vector <- c(0, 0, 1))
# [1] 0 0 1

计算:

t(t(table) == vector)
#       [,1]  [,2]  [,3]
# [1,]  TRUE FALSE FALSE
# [2,] FALSE FALSE FALSE
# [3,] FALSE  TRUE  TRUE
# [4,]  TRUE FALSE FALSE

与使用apply方法相比,这种方法的一个优点是所有操作都是向量化的,这意味着在处理大型矩阵时更加高效。为了证明这一点,让我们看一个有一百万行的矩阵:
set.seed(144)
table <- matrix(sample(0:1, 3e6, replace=TRUE), 1e6)
system.time(t(t(table) == vector))
#    user  system elapsed 
#   0.066   0.013   0.078 
system.time(t(apply(table,1,function(x) x==vector)))
#    user  system elapsed 
#   2.508   0.057   2.576 

1

解释

当你将一个向量(vector)与一个矩阵(matrix)进行比较时,它是按列进行比较的。

请参见以下可重现的示例:

table <- matrix(c(rep(0,60),rep(1,60),rep(1,60)),ncol=3)
vector <- c(1,0,1)

head(table==vector)

      [,1]  [,2]  [,3]
[1,] FALSE  TRUE  TRUE
[2,]  TRUE FALSE FALSE
[3,] FALSE  TRUE  TRUE
[4,] FALSE  TRUE  TRUE
[5,]  TRUE FALSE FALSE
[6,] FALSE  TRUE  TRUE

1,1是错误的,因为vector[1]==1table[1,1]==02,1是正确的,因为vector[2]==0table[2,1]==0,以此类推。

解决方案

head(t(apply(table,1,function(x) x==vector)))

      [,1]  [,2] [,3]
[1,] FALSE FALSE TRUE
[2,] FALSE FALSE TRUE
[3,] FALSE FALSE TRUE
[4,] FALSE FALSE TRUE
[5,] FALSE FALSE TRUE
[6,] FALSE FALSE TRUE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接