벡터의 모든 요소가 서로 같은지 테스트하려고합니다. 내가 생각해 낸 솔루션은 length()
.
x <- c(1, 2, 3, 4, 5, 6, 1) # FALSE
y <- rep(2, times = 7) # TRUE
와 함께 unique()
:
length(unique(x)) == 1
length(unique(y)) == 1
와 함께 rle()
:
length(rle(x)$values) == 1
length(rle(y)$values) == 1
요소 간 '평등'을 평가하기위한 허용 오차 값을 포함 할 수있는 솔루션은 FAQ 7.31 문제 를 방지하는 데 이상적입니다 .
내가 완전히 간과 한 테스트 유형에 대한 내장 기능이 있습니까? identical()
그리고 all.equal()
그들은 여기에 작동하지 않도록, 두 개의 R 객체를 비교합니다.
편집 1
다음은 몇 가지 벤치마킹 결과입니다. 코드 사용 :
library(rbenchmark)
John <- function() all( abs(x - mean(x)) < .Machine$double.eps ^ 0.5 )
DWin <- function() {diff(range(x)) < .Machine$double.eps ^ 0.5}
zero_range <- function() {
if (length(x) == 1) return(TRUE)
x <- range(x) / mean(x)
isTRUE(all.equal(x[1], x[2], tolerance = .Machine$double.eps ^ 0.5))
}
x <- runif(500000);
benchmark(John(), DWin(), zero_range(),
columns=c("test", "replications", "elapsed", "relative"),
order="relative", replications = 10000)
결과 :
test replications elapsed relative
2 DWin() 10000 109.415 1.000000
3 zero_range() 10000 126.912 1.159914
1 John() 10000 208.463 1.905251
그래서 diff(range(x)) < .Machine$double.eps ^ 0.5
가장 빠른 것 같습니다 .