如何检查列中是否只包含相同的元素?

时间:2015-08-12 14:49:47

标签: r

示例数据:

x <- matrix(c("Stack","Stack","Stack",
              "Overflow","Overflow","wolfrevO"),
            nrow=3,ncol=2)

如何检查x[,1]是否包含完全相同的元素?

如果x包含NA s,此方法是否仍适用?

由于

6 个答案:

答案 0 :(得分:4)

您可以将矢量的第一个值与矢量的其余部分进行比较。

all(x[-1, 1] == x[1, 1])
# [1] TRUE

如果存在NA值,则此确切方法仍不适用。但是,可以使用na.omit()轻松纠正。例如 -

## create a vector with an NA value
x2 <- c(x[, 1], NA)

## standard check returns NA
all(x2 == x2[1])
# [1] NA

## call na.omit() to remove, then compare
all(na.omit(x2) == x2[1])
# [1] TRUE

那么,使用矩阵x,最后一行将成为

all(na.omit(x[-1, 1]) == x[1, 1])

答案 1 :(得分:3)

您可以计算列的唯一元素:

length(unique(x[,1]))==1
即使您的数据中存在NA,

仍然有效。

用于检查每列的使用:

apply(x, 2, function(a) length(unique(a))==1)

答案 2 :(得分:2)

您可以使用duplicated功能:

如果sum(!duplicated(x[,1]))==1返回TRUE,则该列包含所有相同的值。

sum(!duplicated(x[,1]))==1
[1] TRUE

sum(!duplicated(x[,2]))==1
[1] FALSE

如果x包含NAs,则此方法将起作用,因为所有NA列都将返回TRUE,混合列将返回FALSE

x <- matrix(c(NA,NA,NA,"Overflow","Overflow",NA),nrow=3,ncol=2)

sum(!duplicated(x[,2]))==1
[1] FALSE

sum(!duplicated(x[,1]))==1
[1] TRUE

答案 3 :(得分:1)

如果您想查看哪些元素是重复的,以及您可以使用table的次数。

table(x[,1])
# Stack 
# 3 

table(x[,2])
# Overflow wolfrevO 
#    2        1 

要查看列中是否只有一个唯一值,请使用dim

dim(table(x[,1])) == 1
# [1] TRUE

答案 4 :(得分:0)

我同意@Richard Scriven的角色,因素等(all(x[-1, 1] == x[1, 1]))。

然而,为了比较数值,更有效的方法可能很有用:

all.same <- function (x) {
    abs(max(x) - min(x)) < 8.881784e-16
    # the constant above is just .Machine$double.eps*4
}
apply(x, 2, all.same)

答案 5 :(得分:0)

建议方法的比较:

x <- rep(1, 1000)
x[5] <- 0

microbenchmark::microbenchmark(
  all(duplicated(x)), 
  length(unique(x)) == 1, 
  dim(table(x)) == 1, 
  all(x == x[1]),
  times = 1000)

Unit: microseconds
                   expr      min       lq        mean   median       uq      max neval cld
     all(duplicated(x))   19.594   21.461   24.688356   22.861   24.727   74.646  1000  b 
 length(unique(x)) == 1   21.461   23.793   26.972993   25.193   26.127  156.755  1000  b 
     dim(table(x)) == 1 1067.422 1090.282 1144.309131 1123.872 1154.197 2072.795  1000   c
         all(x == x[1])    3.267    4.199    4.629929    4.200    4.666   22.394  1000 a  

x是一列或一行。可以使用Matrixdata.frame或类似的每行或列相等性测试:

all(apply(X, 1, function(x){all(x == x[1])}))