定义特定于数据的Clojure函数,可能使用宏?

时间:2014-09-26 20:22:30

标签: macros clojure etl

我正在处理大量数据,处理类型取决于正在处理的数据。最终目标是为每行有效执行的每个元素提供一个函数。下面只是一个使用除以平均值的示例,但我试图找到一个可以应用任何函数的解决方案。

假设我想读取数字向量的向量,并返回将第一个数除以其位置的平均数和从第二个数中减去最小数的结果。

示例:

输入:

(def inputs
[[1.0,1.0]
 [2.0,4.0]
 [3.0,9.0]])

平均值:

(def avgs
[2.0,7.0])

Mininums:

(def mins
[1.0,1.0])

输出:

(def outputs
[[0.50,0.00]
 [1.00,3.00]
 [1.50,8.00]])

指令:

(def avg-ids [0])    (def subtr-ids [1])

一种天真的方法是查找每个职位的除数:

(defn avg-elem [element position]
  (/ element (nth avgs position)))

(defn subtr-elem [element position]
  (- element (nth mins position)))

(mapv
    #(map-indexed
      (fn [elem idx] (if (is-avg-idx? idx) (avg-elem elem idx) (subtr-elem elem idx)))
    %)
inputs)

我想做的是以下内容:

(fn [elem] (/ elem 2.0))
(fn [elem] (- elem 1.0))

并且有一些函数将相应的函数应用于每一行中的每个元素。

2 个答案:

答案 0 :(得分:1)

我不确定您要做什么,但是这里有一些方法可以将inputs矩阵的每一列划分为avgs向量的相应元素:

(mapv (partial mapv /) inputs (repeat avgs))

(mapv #(mapv / % avgs) inputs)

答案 1 :(得分:1)

这是你之后的事吗?

(def row-fns (map (fn [avg] #(/ % avg)) avgs))
(mapv (fn [row] (mapv #(%1 %2) row-fns row)) inputs)

row-fns替换为任何单参数函数列表。