2011-03-30 58 views

回答

5

使用$宏。

=> (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 
+0

確實,($:a data)的類型是LazySeq,但是當詢問多個列時, G。 ($:所有數據)它是數據集。當有多個問題需要時,有什麼方法可以獲得一系列的列? – 0dB 2013-04-23 09:56:52

2

看着to-vect的源代碼,它利用map來建立結果,它已經提供了一個程度的懶惰。不幸的是,它看起來像整個數據集首先轉換爲toArray,可能只是放棄了map懶惰的所有好處。

如果您想要了解更多,您可能需要深入瞭解Java object的血腥細節,從而有效地保存數據集的矩陣版本並編寫自己的版本。

1

您可以使用數據集的內部結構。

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。你可能應該檢查一下這些蹲點傢伙。

相關問題