Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查列在R中是否只包含相同的元素?_R - Fatal编程技术网

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

如何检查列在R中是否只包含相同的元素?,r,R,示例数据: x <- matrix(c("Stack","Stack","Stack", "Overflow","Overflow","wolfrevO"), nrow=3,ncol=2) x您可以使用duplicated功能: 如果sum(!duplicated(x[,1])==1,则返回TRUE该列包含所有相同的值 sum(!duplicated(x[,1]))==1 [1] TRUE sum(!duplicated(x[,2])

示例数据:

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

x您可以使用
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

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

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

如果您想查看哪些元素被复制,以及您可以使用
的次数

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

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

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

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

计算列的唯一元素数:

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

要检查每个列,请使用:

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

我同意@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)
所有建议方法的比较:

如果有一个NA和两个相同的元素,
apply(x,2,函数(p)length(unique(p))==1)
可能会返回FALSE,但如果有3个NAs(这会检查所有列,仅针对x[,1],您可以执行
length(unique(x[,1])==1
length(unique(x[!is.NA(x[,1]))==1
在测试前删除NAs)不起作用:x[2,1]=NA;dim(表(x[,1]))==1仍然为真。请参见
?表
,了解
useNA
参数,具体取决于您希望如何处理
NA
。例如,
dim(表(x[,1],useNA=“ifany”))
。检查每一列的第二个值非常好。如果向量中只有一个唯一值,如果唯一值为1,实际上可以执行
unique(x)==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)
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  
all(apply(X, 1, function(x){all(x == x[1])}))