Какой идиоматический способ получить последовательность столбцов из набора данных заклинателя? - PullRequest
5 голосов
/ 30 марта 2011

Каков наилучший способ получить последовательность столбцов (в виде векторов или чего-либо еще) из набора данных Incanter?

Я думал о:

(to-vect (trans (to-matrix my-dataset)))

Но в идеале я бы хотел ленивую последовательность. Есть ли лучший способ?

Ответы [ 3 ]

5 голосов
/ 22 июня 2011

Используйте макрос $.

=> (def data (to-dataset [{:a 1 :b 2} {:a 3 :b 4}]))
=> ($ :a data)  ;; :a column
=> ($ 0 :all data) ;; first row

=> (type ($ :a data))
clojure.lang.LazySeq
2 голосов
/ 30 марта 2011

Глядя на исходный код для to-vect, он использует map для получения результата, который уже обеспечивает одну степень ленивости.К сожалению, похоже, что весь набор данных сначала преобразуется toArray, возможно, просто отдавая все преимущества map лени. Java-объект , эффективно удерживающий матричную версию набора данных и записывающую собственную версию to-vect.

1 голос
/ 30 марта 2011

Вы можете использовать внутреннюю структуру набора данных.

user=> (use 'incanter.core)
nil
user=> (def d (to-dataset [{:a 1 :b 2} {:a 3 :b 4}]))
#'user/d
user=> (:column-names d)
[:a :b]
user=> (:rows d)
[{:a 1, :b 2} {:a 3, :b 4}]
user=> (defn columns-of
         [dataset]
         (for [column (:column-names dataset)]
           (map #(get % column) (:rows dataset))))
#'user/columns-of
user=> (columns-of d)
((1 3) (2 4))

Хотя я не уверен, насколько внутренняя структура является общедоступным API.Вам, наверное, стоит проверить это с парнями-заклинателями.

...