R中最快的方法是检查所有列是否相同

时间:2014-10-08 17:10:59

标签: r matrix

假设我有一个包含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

检查所有列是否相同的最快方法是什么?我可以做一些像allidentical来检查任何两个,然后继续折叠下一组但是还有什么更聪明的吗?

理想情况下,我想要一个独立于列数的解决方案。

3 个答案:

答案 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