假设我想根据向量中近似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: Numeric vectors to compare”,但这当然不完全正确,y
必须是x
' 长度或单个值,因为near()
所做的就是使用该abs()
函数:
near <- function (x, y, tol = .Machine$double.eps^0.5)
{
abs(x - y) < tol
}
如果我们这样做,我们会看到abs()
takey
的值并重复它们直到它需要(不是没有警告),我们得到:
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
我目前的解决方案是使用sapply()
ony
的元素来创建一个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
我不会创建一个包含数千行的临时矩阵吗?有更好的办法吗?