5

Incanterデータセットから(ベクトルなどとして)列のシーケンスを取得するための最良の方法は何ですか?

私は考えました:

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

しかし、理想的には、怠惰なシーケンスが必要です。もっと良い方法はありますか?

4

3 に答える 3

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
于 2011-06-22T16:41:17.603 に答える
2

そのソースコードを見ると、結果を構築するためにto-vect利用されます。これは、すでに1度の怠惰をもたらしています。map残念ながら、データセット全体が最初に変換されたように見えます。toArrayおそらく、怠惰のすべての利点を提供しているだけmapです。

さらに必要な場合は、データセットのマトリックスバージョンを効果的に保持しているJavaオブジェクトの厄介な詳細に飛び込み、独自のバージョンのto-vectを作成する必要があります。

于 2011-03-30T07:25:37.237 に答える
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 なのかはわかりませんが。おそらく、インキャンターの連中に確認する必要があります。

于 2011-03-30T14:54:19.313 に答える