检查矩阵中的所有行是否相同

时间:2016-02-23 02:32:03

标签: r

我正在查看sample(..., replace=T)是否会导致同一行n次采样。我看到duplicated函数通过返回每个索引的逻辑向量来检查元素是否重复,但我需要查看一个元素是否重复n次(单个布尔值)。什么是最好的方法呢?

这只是一个例子。此矩阵的某些函数应返回TRUE

t(matrix(c(rep(c(rep(4,1),rep(5,1)),8)),nrow=2,ncol=8))
     [,1] [,2]
[1,]    4    5
[2,]    4    5
[3,]    4    5
[4,]    4    5
[5,]    4    5
[6,]    4    5
[7,]    4    5
[8,]    4    5

4 个答案:

答案 0 :(得分:5)

这是一个可以产生您正在寻找的真/假结果的解决方案:

m <- t(matrix(c(rep(c(rep(4,1),rep(5,1)),8)),nrow=2,ncol=8))
apply(m, 2, function(x) length(unique(x)) == 1)
[1] TRUE TRUE

m <- rbind(m, c(4, 6))
apply(m, 2, function(x) length(unique(x)) == 1)
[1]  TRUE FALSE

如果你想要一个布尔值来说明所有列是否都有唯一值,你可以这样做:

all(apply(m, 2, function(x) length(unique(x)) == 1) == TRUE)
[1] FALSE

答案 1 :(得分:0)

认为我已经找到了解决方案。

B <- t(matrix(c(rep(c(rep(4,1),rep(5,1)),8)),nrow=2,ncol=8))
length(table(B)) == ncol(B)
[1] TRUE
B <- rbind(B,c(4,6)) # different sample
length(table(B)) == ncol(B)
[1] FALSE

答案 2 :(得分:0)

我们还可以复制第一行,与原始矩阵进行比较,得到colSums并检查它是否等于'm'的nrow

colSums(m[1,][col(m)]==m)==nrow(m)
[1] TRUE TRUE

或另一种选择是检查方差

!apply(m, 2, var)
#[1] TRUE TRUE

答案 3 :(得分:0)

看起来更清晰(更容易分辨代码在做什么):

m <- t(matrix(c(rep(c(rep(4,1),rep(5,1)),8)),nrow=2,ncol=8))
apply(m, 2, function(x) all(x==x[1]))
[1] TRUE TRUE