Отфильтровать вектор на основе нескольких приблизительных значений
Предположим, я хочу отфильтровать вектор на основе того, какие значения появляются примерно в векторе:
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
В
dplyr::near(x, y, tol)
в файле справки функции упоминается «x, y: числовые векторы для сравнения», но это, конечно, не совсем верно, должно быть либо длины, либо одного значения, потому что все
near()
использует функцию:
near <- function (x, y, tol = .Machine$double.eps^0.5)
{
abs(x - y) < tol
}
И если мы это сделаем, мы увидим
abs()
принимает значения и повторяет их до тех пор, пока это не понадобится (не без предупреждения), и мы получим:
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()
on, чтобы создать
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
, разве я не создал бы временную матрицу с тысячами строк? Есть способ лучше?
2 ответа
Ты мог бы
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