Clojure:如何将函数应用于哈希映射值,其中一些是向量

时间:2013-10-28 06:11:47

标签: clojure

我正在尝试更改哈希映射中值的类型(哈希映射包含从csv文件导入的数据,它将所有内容作为字符串导入,从而产生此问题)从字符串到float:

示例输入:

(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]}

我在下面的托马斯上找到了一个很好的例子,但它似乎不适用于矢量的地图值:

(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

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

问题是重映射的(应用f v)部分要求f为多重函数。我会将重新映射更改为:

(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]}