Nano Hash - криптовалюты, майнинг, программирование

Есть ли функция, которая для close() аналогична %in% ==?

У меня есть data.frame или tibble с числовым столбцом x:

library(dplyr)
data <- tibble(x = c(0.123456, 0.5678910, 1.234567, 5.67891011, 12.345678),
               y = c(1, 2, 3, 4, 5))

Чтобы отфильтровать строки, где x близко (с заданным допуском, например, 1e-4) к набору значений, например. c(0.5679, 5.6789). Я бы использовал что-то вроде этого:

data %>% filter(near(x, 0.5679, 1e-4) | near(x, 5.6789, 1e-4))
#> # A tibble: 2 x 2
#>       x     y
#>   <dbl> <dbl>
#> 1 0.568     2
#> 2 5.68      4

Это становится многословным, если вместо c(0.5679, 5.6789) у меня есть вектор из 100 элементов... Итак, есть ли функция, позволяющая написать что-то вроде:

data %>% filter(near_any(x, c(0.5679, 5.6789), tol = 1e-4))

Другими словами, есть ли функция, которая для near() является тем же, чем %in% для ==?

(Я могу написать такую ​​функцию near_any(), но прежде я хочу проверить, не существует ли она еще)

Создано 10 июля 2018 г. пакетом reprex (v0.2.0).

10.07.2018

  • Почти наверняка вам придется написать его самостоятельно. Тем не менее, это просто near_any = function (x, y) any(near(x, y, 1e-4)). В этом случае у меня возникнет соблазн полностью отказаться от этой функции. 10.07.2018
  • Это не то, что я хочу (мой результат - вектор того же размера, что и x), поэтому скорее что-то вроде: function(x, values, tol) { for (val in values) { result <- result | near(x, val, tol) } return(result) } 10.07.2018

Ответы:


1

В dplyr его нет, в базе R скорее всего нет. Если вы спрашиваете о других пакетах, это выходит за рамки SO.

Но вы можете сделать это следующим образом:

data %>%
  filter(Reduce(`|`,lapply(c(0.5679, 5.6789), near, x= x, tol = 1e-4)))

# # A tibble: 2 x 2
#          x     y
#      <dbl> <dbl>
# 1 0.567891     2
# 2 5.678910     4

Или на языке tidyverse, используя также пакет purrr:

data %>%
  filter(reduce(map(c(0.5679, 5.6789), near, x= x, tol = 1e-4),`|`))
10.07.2018
  • Ваш ответ заключается в повторной реализации базовой функции R any (только что векторизованной), и вам нужно использовать lapply не для значений y, а для значений x (что практически наверняка более эффективно для больших таблиц). 10.07.2018
  • не совсем так, все мои операции ИЛИ векторизованы, ваши нет, мы просто векторизируем в разных местах. Ваш может быть более эффективным или более эффективным в некоторых случаях, мы должны были бы проверить это. 10.07.2018
  • Я хочу сказать, что векторизация уровня C на несколько порядков более эффективна, чем векторизация уровня R (т.е. lapply или map). Таким образом, использование векторизованных операций внутри near должно выполняться для более длинного вектора. 10.07.2018
  • Я вас понимаю, но в моем примере я зацикливаюсь 2 раза на 2 объектах (4 итерации), остальное векторизовано, вы зацикливаетесь с map_lgl на каждом элементе столбца x 10.07.2018
  • Спасибо @Moody_Mudskipper, это именно то, что я хотел знать. 10.07.2018
  • небольшая поправочка, у меня 2*(2-1) так 2 итераций, а не 4, так как Reduce применяет свою функцию n-1 раз :). 10.07.2018

  • 2

    near(x, y) уже векторизован, поэтому заверните его в any возвращает одно значение.

    Чтобы использовать его в вашем случае, вам просто нужно map над значениями x:

    data %>% filter(map_lgl(x, ~ any(near(.x, c(0.5679, 5.6789), tol = 1e-4))))
    
    10.07.2018
  • Это не возвращает ожидаемый результат 10.07.2018
  • @KonradRudolph, я бы предпочел сопоставить / зациклить y, поэтому я выберу ответ Moody_Mudskipper. Тем не менее проголосовал за ваш ответ, а также он может быть полезен для людей, желающих вместо этого сопоставить x. 10.07.2018
  • @byouness Да, это хорошее рассуждение, как я сам объяснил в своем (неуместном) комментарии к ответу Муди. 10.07.2018

  • 3

    Вы можете использовать data.tables (очень быстро) foverlaps()

    library(data.table)
    #create the data.table
    data <- data.table( x = c(0.123456, 0.5678910, 1.234567, 5.67891011, 12.345678),
                        y = c(1, 2, 3, 4, 5))
    #add a min-max column to join  on. they are both eequal to the value of x
    data[, c("min", "max") := list(x, x)]
    
    #set the precision
    precision <- 1e-4
    
    #create a data.table with filter values and theur range (+/- precision)
    filter_values <- setDT(data.table( x = c(0.5679, 5.6789)))
    filter_values[, c("min", "max") := list(x - precision, x + precision)]
    #set key for join
    setkey(filter_values, min, max)
    
    #perform an overlap-join, keep only columns x and y, where a match with a filter_value is found
    foverlaps(data,filter_values)[!is.na(x),c("x","y")]
    
    #         x y
    # 1: 0.5679 2
    # 2: 5.6789 4
    
    10.07.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..