R 按返回到矩阵中的位置

R 按返回到矩阵中的位置,r,R,comNR的矩阵运算是按列顺序进行的,因此which指令中的比较会逐列比较向量c(0,0,0,0,1)并循环使用。看看这个简单的例子会发生什么 m <- matrix(1:8, ncol = 2) m # [,1] [,2] #[1,] 1 5 #[2,] 2 6 #[3,] 3 7 #[4,] 4 8 m == c(1, 5) # [,1] [,2] #[1,] TRUE FALSE #[2,] FALSE FALS

comNR的矩阵运算是按列顺序进行的,因此
which
指令中的比较会逐列比较向量
c(0,0,0,0,1)
并循环使用。看看这个简单的例子会发生什么

m <- matrix(1:8, ncol = 2)
m
#     [,1] [,2]
#[1,]    1    5
#[2,]    2    6
#[3,]    3    7
#[4,]    4    8

m == c(1, 5)
#      [,1]  [,2]
#[1,]  TRUE FALSE
#[2,] FALSE FALSE
#[3,] FALSE FALSE
#[4,] FALSE FALSE
然后循环使用
c(1,5)
,并与第一列中的下一个值进行比较。因此,当它到达第二列时,该列中的第一个比较是

c(5, 6) == c(1, 5)
#[1] FALSE FALSE
返回
c(FALSE,FALSE)

这就是为什么我在下面的解决方案中需要转置
t()。
一种可能是

which(colSums(t(comN) == c(0,0,0,0,1)) == ncol(comN))
#[1] 2


colSums
解决方案大约快3倍。

我们可以使用
sweep
comN
的行值与向量进行比较,并使用
rowSums
计算每行
TRUE
的数量

which(rowSums(sweep(comN, 2, c(0,0,0,0,1), `==`)) == ncol(comN))
#[1] 2
除了
rowSums
,我们还可以使用
apply
,因为
sweep
已经返回了一个逻辑向量矩阵

which(apply(sweep(comN, 2,c(0,0,0,0,1), `==`), 1, all))

which(colSums(t(comN)=c(0,0,0,0,1))==ncol(comN))
。请注意,R的矩阵运算是按列顺序进行的,因此
which
指令中的比较逐列比较向量
c(0,0,0,0,1)
。这就是为什么我在上面的解决方案中需要转置
t()
,或者
(应用(t(comN)==c(0,0,0,0,1),2,all))
colSums
解决方案速度更快。
which(rowSums(sweep(comN, 2, c(0,0,0,0,1), `==`)) == ncol(comN))
#[1] 2
which(apply(sweep(comN, 2,c(0,0,0,0,1), `==`), 1, all))