1

ハッシュ マップの値の型を変更しようとしています (ハッシュ マップには csv ファイルからインポートされたデータが含まれており、すべてを文字列としてインポートし、この問題を引き起こしています)。

入力例:

(def toydata {"EGFR" ["12.34" "4.45" "1.32"], "MYCN" "5.11", "ABC9" ["3.21" "1.32"]})

私が欲しいもの:

{"EGFR" [12.4 4.45 1.32] "MYCN" 5.11 "ABC9" [3.21 1.32]}

以下に示す Thomas による SO で素晴らしい例を見つけましたが、ベクトルであるマップ値では機能しないようです。

(defn remap [m f] 
  (reduce (fn [r [k v]] (assoc r k (apply f v))) {} m))

マップでこの関数を呼び出そうとすると:

(remap toydata #(Float/parseFloat %))

エラーが発生します:

ClassCastException clojure.lang.PersistentVector cannot be cast to java.lang.String

誰でも助けることができますか?

4

1 に答える 1

2

問題は、remap の (apply fv) 部分で、f がマルチアリティ関数である必要があることです。remap を次のように変更します。

(defn remap [m f] 
  (reduce (fn [r [k v]] (assoc r k (f v))) {} m))

そして、する

(remap toydata (fn[x] 
  (if (coll? x) (into [] (map #(Float/parseFloat %) x)) (#(Float/parseFloat %) x))))

出力:

{"MYCN" 5.11, "ABC9" [3.21 1.32], "EGFR" [12.34 4.45 1.32]}
于 2013-10-28T06:50:52.253 に答える