r语言 - 基于近似多个值过滤向量



假设我要过滤向量x,基于向量y近似的值:

x <- c(1.123456789, 2.123456789, 3.123456789)
y <- c(1.12345, 2.12345)

如果我不想进行近似比较,我会使用%in%:

x %in% y
[1] FALSE FALSE FALSE

我需要的结果是:

# something like: x %near_in% y
[1] TRUE TRUE FALSE

dplyr::near(x, y, tol)函数的帮助文件提到了"x, y:数字矢量进行比较",但这当然不是完全正确的,y必须是x的长度或单个值,因为所有near()所做的都是使用abs()函数:

near <- function (x, y, tol = .Machine$double.eps^0.5) 
{
abs(x - y) < tol
}

如果我们这样做,我们看到abs()获取y的值并重复它们,直到它需要这样做(不是没有警告),我们得到:

abs(x - y)
[1] 0.000006789 0.000006789 2.000006789
Warning message:
In x - y : longer object length is not a multiple of shorter object length

我目前的解决方案是在y的元素上使用sapply()来创建n x m矩阵(这里为3 x 2),然后使用apply()来查看any()的行(x的值)中是否有TRUE:

apply(sapply(y, function(y_val) near(x, y_val, 0.0001)), 1, any)
[1] TRUE TRUE FALSE

但是这看起来很麻烦!如果我在y中有数千个值,我不会创建一个具有数千行的临时矩阵吗?有更好的办法吗?

您可以floorround的值:

tol <- 1e-5
floor(x/tol)
#> [1] 112345 212345 312345
floor(y/tol)
#> [1] 112345 212345
floor(x/tol) %in% floor(y/tol)
#> [1]  TRUE  TRUE FALSE

我不太确定。但是看看DescTools库,你可以找到最接近的值:

library(DescTools)
y %in% sapply(x, function(i) Closest(y, i))
[1] TRUE TRUE

相关内容

  • 没有找到相关文章

最新更新