假设我有一个包含3列的矩阵
10 10 10
8 8 8
9 9 9
7 7 7
5 5 5
4 4 4
3 3 3
6 6 6
2 2 2
1 1 1
检查所有列是否相同的最快方法是什么?我可以做一些像all
或identical
来检查任何两个,然后继续折叠下一组但是还有什么更聪明的吗?
理想情况下,我想要一个独立于列数的解决方案。
答案 0 :(得分:5)
也许
all(duplicated(t(m))[-1])
会奏效。这转换矩阵(因为duplicated
按行工作),然后检查除第一行之外的每一行是否与前一行重复。
@ akrun的答案可能稍微快一些。这两个答案都依赖于对行/列结构的了解:在@ akrun的情况下,矩阵以列主要顺序存储(因此复制第一列以匹配完整解压缩矩阵的长度将起作用),在我的情况下, duplicated
按行进行。
如果你想避免这些知识,你可以使用
all(sweep(m,MARGIN=1,STATS=m[,1],FUN="=="))
(对每个列与m[,1]
的相应元素进行逐元素比较,然后查看所有比较是否都为真)
答案 1 :(得分:5)
你可以尝试:
all(m1[,1]==m1)
# [1] TRUE
all(m2[,1]==m2)
#[1] FALSE
m1 <- matrix(c(10:1, 10:1, 10:1), ncol=3)
m2 <- cbind(m1, 11:2)
答案 2 :(得分:3)
您可以使用rankMatrix函数来确定您拥有的线性独立列数。如果结果相同,则应为1。
require(Matrix) # now a recommended package so it ships with R
m <- matrix(10:1, 10,3)
rankMatrix(m)==1
#[1] TRUE