clojure:根据其他键/值对计算地图中的新键/值对

时间:2019-07-25 22:38:05

标签: clojure

我有一个映射向量,代表一个DataFrame。我想计算一个新列(向量中所有地图的键/值对)。需要一些帮助以最有效和惯用的方式进行操作。

(def dt [{:foo 10 :bar 20 :cat "A"}
         {:foo 15 :bar 10 :cat "B"}
         {:foo 12 :bar 15 :cat "C"}
         {:foo 16 :bar 22 :cat "A"}
         {:foo 13 :bar 11 :cat "B"}
         {:foo 10 :bar 19 :cat "C"}])

我想做的是定义:baz =:foo +:bar。我可以通过以下映射操作来完成计算。

(map #(+ (:foo %) (:bar %)) dt)

我宁愿写一个向量为maps的函数作为最后一个参数,以便我可以使用thread-last宏链接操作

类似这样的东西:

(->> dt
     (filter #(= (:foo %) 10))
     (compute-new-column #(...)))

我是Clojure和FP的初学者,因此,任何其他见解也将受到赞赏。

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,则希望基于:foo:bar向集合中的每个映射添加新的键值对。

(defn compute-new-column [row]
  (assoc row :baz (+ (:foo row) (:bar row))))

然后,您可以在线程宏中映射此函数。就像在过滤器中一样,使用匿名函数也很容易做到这一点。

(->> dt
     (filter #(= (:foo %) 10))
     (map compute-new-column))


({:foo 10, :bar 20, :cat "A", :baz 30} {:foo 10, :bar 19, :cat "C", :baz 29})
相关问题