8

インカンター データ セット内の個々の列を変換し、結果のデータ セットを新しい (csv) ファイルに保存できるようにしたいと考えています。それを行う最も簡単な方法は何ですか?

基本的に、データセットの列に関数をマップし、元の列をこの結果に置き換えられるようにしたいと考えています。

4

4 に答える 4

5

これは、列名と順序保持の2つの類似した関数です。

(defn transform-column [col-name f data] 
  (let [new-col-names (sort-by #(= % col-name) (col-names data))
        new-dataset (conj-cols
                      (sel data :except-cols col-name)
                      (f ($ col-name data)))]

    ($ (col-names data) (col-names new-dataset new-col-names) )))

(defn transform-rows [col-name f data] 
  (let [new-col-names (sort-by #(= % col-name) (col-names data))
        new-dataset (conj-cols
                      (sel data :except-cols col-name)
                      ($map f col-name data))]

そして、これが違いを説明する例です:

=> (def test-data (to-dataset [{:a 1 :b 2} {:a 3 :b 4}])) 
=> (transform-column :a (fn [x] (map #(* % 2) x)) test-data)
[:a :b]
[2 2]
[6 4]

=> (transform-rows   :a #(* % 2) test-data)
[:a :b]
[2 2]
[6 4]

transform-rows単純な変換に最適ですtransform-column。1つの行の変換が他の行に依存している場合(列の正規化など)の場合と同様です。

CSVの保存と読み込みは、標準のIncanter関数を使用して実行できるため、完全な例は次のようになります。

(use '(incanter core io)))

(def data (col-names (read-dataset 'data.csv') [:a :b])

(save (transform-rows :a #(* % 2) data) 'transformed-data.csv')
于 2011-08-03T04:38:54.507 に答える
5

次のように定義できます。

(defn map-data [dataset column fn]
  (conj-cols (sel dataset :except-cols column)
             ($map fn column dataset)))

として使用します

(def data (get-dataset :cars))
(map-data data :speed #(* % 2))

列名の変更に関する問題は 1 つだけです。時間があるときに修正してみます...

于 2011-03-30T09:17:06.103 に答える
2

繰り返しますが、データセットの内部構造を使用できるかもしれません。

user=> (defn update-column
         [dataset column f & args]
         (->> (map #(apply update-in % [column] f args) (:rows dataset))
           vec
           (assoc dataset :rows)))
#'user/update-column
user=> d
[:col-0 :col-1]
[1 2]
[3 4]
[5 6]

user=> (update-column d :col-1 str "d")
[:col-0 :col-1]
[1 "2d"]
[3 "4d"]
[5 "6d"]

ここでも、これがどこまでパブリック API であるかを確認する必要があります。

于 2011-03-30T15:09:16.843 に答える
2

注: このソリューションには Incanter 1.5.3 以降が必要です

Incanterの最近のバージョンを使用できる方へ...

add-columnadd-derived-columnは 1.5.3 で Incanter に追加されました(プルリクエスト)

ドキュメントから:

列を追加

"指定された値を持つ列をデータセットに追加します。"

(add-column column-name values)

また

(add-column column-name values data)

または、次を使用できます。

追加派生列

"この関数は、既存の列の関数であるデータセットに列を追加します。データセットが提供されていない場合、$data (with-data マクロによってバインドされています) が使用されます。f は from-columns の関数である必要があります。その順序で議論します。」

(add-derived-column column-name from-columns f)

また

(add-derived-column column-name from-columns f data)

より完全な例

(use '(incanter core datasets))
  (def cars (get-dataset :cars))

(add-derived-column :dist-over-speed [:dist :speed] (fn [d s] (/ d s)) cars)

(with-data (get-dataset :cars)
  (view (add-derived-column :speed**-1 [:speed] #(/ 1.0 %))))
于 2014-02-11T23:13:59.620 に答える