從Incanter數據集中獲取一列(作爲矢量或其他)的最佳方式是什麼?從incanter數據集中獲取列序列的慣用方法是什麼?
我想到:
(to-vect (trans (to-matrix my-dataset)))
但理想的情況下,我想一個懶惰的序列。有沒有更好的辦法?
從Incanter數據集中獲取一列(作爲矢量或其他)的最佳方式是什麼?從incanter數據集中獲取列序列的慣用方法是什麼?
我想到:
(to-vect (trans (to-matrix my-dataset)))
但理想的情況下,我想一個懶惰的序列。有沒有更好的辦法?
使用$
宏。
=> (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
看着to-vect
的源代碼,它利用map
來建立結果,它已經提供了一個程度的懶惰。不幸的是,它看起來像整個數據集首先轉換爲toArray
,可能只是放棄了map
懶惰的所有好處。
如果您想要了解更多,您可能需要深入瞭解Java object的血腥細節,從而有效地保存數據集的矩陣版本並編寫自己的版本。
您可以使用數據集的內部結構。
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。你可能應該檢查一下這些蹲點傢伙。
確實,($:a data)的類型是LazySeq,但是當詢問多個列時, G。 ($:所有數據)它是數據集。當有多個問題需要時,有什麼方法可以獲得一系列的列? – 0dB 2013-04-23 09:56:52