【问题标题】:What is the idiomatic way to obtain a sequence of columns from an incanter dataset?从 incanter 数据集中获取列序列的惯用方法是什么?
【发布时间】:2011-06-23 00:41:17
【问题描述】:

从 Incanter 数据集中获取列序列(作为向量或其他)的最佳方法是什么?

我想到了:

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

但理想情况下,我想要一个惰性序列。有没有更好的办法?

【问题讨论】:

    标签: clojure incanter


    【解决方案1】:

    使用$ 宏。

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

    【讨论】:

    • 没错,($ :a data) 的类型是 LazySeq,但是当要求多于一列时,例如。 G。 ($:所有数据)它是数据集。当要求多个列时,有什么方法可以获取一系列列?
    【解决方案2】:

    查看to-vect 的源代码,它利用map 来构建结果,这已经提供了某种程度的惰性。不幸的是,看起来整个数据集首先转换为toArray,可能只是放弃了map惰性的所有好处。

    如果您想要更多,您可能必须深入了解有效保存数据集矩阵版本的Java object 的血腥细节,并编写您自己的 to-vect 版本。

    【讨论】:

      【解决方案3】:

      您可以使用数据集的内部结构。

      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。你可能应该和咒术师核实一下。

      【讨论】:

        猜你喜欢
        • 2018-07-08
        • 1970-01-01
        • 1970-01-01
        • 2013-03-24
        • 2022-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多