示例数据:
x <- matrix(c("Stack","Stack","Stack",
"Overflow","Overflow","wolfrevO"),
nrow=3,ncol=2)
如何检查x[,1]
是否包含完全相同的元素?
如果x
包含NA
s,此方法是否仍适用?
由于
答案 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
是一列或一行。可以使用Matrix
,data.frame
或类似的每行或列相等性测试:
all(apply(X, 1, function(x){all(x == x[1])}))