如何检查列在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])}))