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))