2014-01-06 41 views
1
(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)) 

顯然這是因爲過濾器的匿名函數正在查看一個LazySeq,它不再具有列名作爲其結構的一部分,所以上面的代碼甚至不會編譯。我的問題是:Incanter是否有辦法執行此篩選查詢,仍然允許使用列關鍵字?例如,我能得到這個工作,因爲我知道:卷是第5列Incanter - 我如何使用列關鍵字而不是nth的過濾器?

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

此外,雖然,我想看看是否有咒術保列關鍵字對於這種類型的一種方式過濾的查詢。

回答

3

示例數據集:

(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的=),:nenot=),:in,:nin(不在)。

:fn是一般的「使用任何函數」關鍵字。

所有這些都可以用$:$fn等)作爲前綴,但含義不變。

相關問題