根据近似的多个值过滤向量
Filter a vector based on approximate multiple values
假设我想根据在向量 y
:
中大约 出现的值过滤向量 x
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: Numeric vectors to compare”,但这当然不完全正确,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
中有数千个值怎么办,我不会创建一个包含数千行的临时矩阵吗?还有更好的方法吗?
您可以 floor
或 round
值:
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
假设我想根据在向量 y
:
x
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: Numeric vectors to compare”,但这当然不完全正确,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
中有数千个值怎么办,我不会创建一个包含数千行的临时矩阵吗?还有更好的方法吗?
您可以 floor
或 round
值:
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