Отфильтровать вектор на основе нескольких приблизительных значений

Предположим, я хочу отфильтровать вектор на основе того, какие значения появляются примерно в векторе:

      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
Другие вопросы по тегам