Incanter - Как я могу использовать фильтр с ключевыми словами столбца вместо nth?

(require '[incanter.core :as icore])

;; Assume dataset "data" is already loaded by incanter.core/read-dataset

;; Let's examine the columns (note that Volume is the 5th column)
(icore/col-names data)
==> [:Date :Open :High :Low :Close :Volume]

;; We CAN use the :Volume keyword to look at just that column
(icore/sel data :cols Volume)
==> (11886469 9367474 12847099 9938230 11446219 12298336 15985045...)

;; But we CANNOT use the :Volume keyword with filters
;; (well, not without looking up the position in col-names first...)
(icore/sel data :filter #(> (#{:Volume} %) 1000000))

Очевидно, это связано с тем, что anon-функция фильтра ищет LazySeq, который больше не имеет имен столбцов как часть своей структуры, поэтому приведенный выше код даже не скомпилируется. У меня такой вопрос: есть ли у Incanter способ выполнить этот отфильтрованный запрос, все еще позволяя мне использовать ключевые слова столбца? Например, я могу заставить это работать, потому что я знаю, что: Том - 5-й столбец

(icore/sel data :filter #(> (nth % 5) 1000000))

Опять же, я смотрю, есть ли у Incanter способ сохранить ключевое слово столбца для этого типа фильтрованного запроса.

1 ответ

Решение

Пример набора данных:

(def data
  (icore/dataset
    [:foo :bar :baz :quux]
    [[0 0 0 0]
     [1 1 1 1]
     [2 2 2 2]]))

Пример запроса с результатом:

(icore/$where {:baz {:fn #(> % 1)}} data)

| :foo | :bar | :baz | :quux |
|------+------+------+-------|
|    2 |    2 |    2 |     2 |

На самом деле это также может быть написано

(icore/$where {:baz {:gt 1}} data)

Несколько таких "ключевых слов предикатов" поддерживаются отдельно :gt: :lt, :lte, :gte, :eq (соответствует Clojure's =), :ne (not=), :in, :nin (не в).

:fn является общим ключевым словом "использовать любую функцию".

Все они могут иметь префикс $ (:$fn и т.д.) без изменения значения.

Другие вопросы по тегам