gpt4 book ai didi

r - 测试单个数值向量的所有元素之间的相等性

转载 作者:行者123 更新时间:2023-12-03 05:01:44 27 4
gpt4 key购买 nike

我正在尝试测试向量的所有元素是否彼此相等。我提出的解决方案似乎有些迂回,都涉及检查 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最快。

最佳答案

为什么不简单地使用方差:

var(x) == 0

如果x 的所有元素都相等,您将得到方差0。但这仅适用于 double 和整数。

根据以下评论进行编辑:
更通用的选项是检查向量中唯一元素的长度,在本例中该长度必须为 1。这样做的优点是它适用于所有类别,而不仅仅是可以计算方差的 double 型和整数型。

length(unique(x)) == 1

关于r - 测试单个数值向量的所有元素之间的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4752275/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com