筛选/求和值,不确定如何实现clojure
我正在尝试“透视”下面的数据,尽管即使在excel中尝试,它似乎也不起作用。我不确定我的逻辑是否正确。基本上,我需要将数据集a转换为数据集b A 日期奖牌值1值2值3值4 2013-03-08银牌0 6052 0 0 2013-03-04青铜0 2013-03-04青铜0 2013-03-04青铜0 2013-03-04青铜0 1437 0 0 2013-03-01青铜0 0 240 0 2013-03-01银币0 2013-03-01青铜0 2013-03-01青铜0 173 0 0 2013-03-08银牌0271 2013-03-04银牌0 2547 0 0 0 2013-03-04青铜0 495 0 0 2013-03-04黄金2790 2013-03-02银牌0 2013-03-01青铜0 2013-03-01银币0 2013-03-01青铜0 2013-03-01青铜0 20 0 0 0 2013-03-03银牌0 B 奖牌价值1价值2价值3价值4 青铜0 2125 240 0 黄金27900 银0 8599 0 271 因此,基本上我尝试按奖牌分组,并根据奖牌过滤器对每个值列求和(奖牌是可变的,可以是紫色、蓝色等)。下面的尝试是完全错误的,我重复使用了一些以前的代码,所以它可能是圆钉方孔区域,但我不确定如何进行,即使在逻辑上它现在让我感到困惑…:( 任何帮助或建议都将不胜感激筛选/求和值,不确定如何实现clojure,clojure,Clojure,我正在尝试“透视”下面的数据,尽管即使在excel中尝试,它似乎也不起作用。我不确定我的逻辑是否正确。基本上,我需要将数据集a转换为数据集b A 日期奖牌值1值2值3值4 2013-03-08银牌0 6052 0 0 2013-03-04青铜0 2013-03-04青铜0 2013-03-04青铜0 2013-03-04青铜0 1437 0 0 2013-03-01青铜0 0 240 0 2013-03-01银币0 2013-03-01青铜0 2013-03-01青铜0 173 0 0 2013
(defn- create-summary [data]
(->> data
(group-by :MEDAL)
vals
(map
(fn [recs]
(let [a (fn [b] (+ (filter #(= b(:MEDAL%)) recs)recs))]
{:MEDAL (:MEDAL (first recs))
:VALUE1sum (a :MEDAL)
:VALUE2sum (a :MEDAL)
:VALUE3sum (a :MEDAL)
:VALUE4sum (a :MEDAL)
})))
))
我认为合并将是整洁解决方案的关键 假设您的数据位于向量中,如下所示:
(def medal-values
[["2013-03-08" "SILVER" 0 6052 0 0]
["2013-03-04" "BRONZE" 0 0 0 0]
["2013-03-04" "BRONZE" 0 0 0 0]
["2013-03-04" "BRONZE" 0 0 0 0]
["2013-03-04" "BRONZE" 0 1437 0 0]
["2013-03-01" "BRONZE" 0 0 240 0]
["2013-03-01" "SILVER" 0 0 0 0]
["2013-03-01" "BRONZE" 0 0 0 0]
["2013-03-01" "SILVER" 0 0 0 0]
["2013-03-01" "BRONZE" 0 0 0 0]
["2013-03-01" "BRONZE" 0 173 0 0]
["2013-03-08" "SILVER" 0 0 0 271]
["2013-03-04" "SILVER" 0 2547 0 0]
["2013-03-04" "BRONZE" 0 495 0 0]
["2013-03-04" "GOLD" 279 0 0 0]
["2013-03-02" "SILVER" 0 0 0 0]
["2013-03-01" "BRONZE" 0 0 0 0]
["2013-03-01" "SILVER" 0 0 0 0]
["2013-03-01" "BRONZE" 0 0 0 0]
["2013-03-01" "BRONZE" 0 20 0 0]
["2013-03-03" "SILVER" 0 0 0 0]])
您可以实现以下所需的转换:
(defn count-medals
[medal-counts]
(merge-with #(map + %1 %2)
(reduce (fn [agg [_ k & counts]] (merge-with
#(map + %1 %2)
agg {k counts})) {} medal-counts)))
结果是:
(count-medals medal-values)
=> {"GOLD" (279 0 0 0), "BRONZE" (0 2125 240 0), "SILVER" (0 8599 0 271)}
肯定会有更好的方法将其折叠一点,但希望这将使您走上正轨。将数据转换为以下结构:
(def data [{:medal "silver" :v1 1 :v2 2 :v3 3}
{:medal "gold" :v1 1 :v2 2 :v3 3}
{:medal "silver" :v1 1 :v2 2 :v3 3}
{:medal "bronze" :v1 1 :v2 2 :v3 3}
{:medal "bronze" :v1 1 :v2 2 :v3 3}
{:medal "gold" :v1 1 :v2 2 :v3 3}])
(->> data
(group-by :medal)
(map (fn [[k v]] [k (apply merge-with + (map #(dissoc % :medal) v))]))
(into {}))
==> {silver {:v1 2, :v2 4, :v3 6}, gold {:v1 2, :v2 4, :v3 6}, bronze {:v1 2, :v2 4, :v3 6}}
(def data [{:BRONZE [0 495 0 0]}
{:GOLD [0 0 55 0]}
{:BRONZE [0 134 0 0]}
{:SILVER [0 348 0 0]}
{:SILVER [764 0 0 0]}])
及
你能粘贴你的数据列表吗?很抱歉,它需要一个散列图,这就是为什么我得到空指针。系统只在散列图中显示数据-所以{:奖牌银,:v12,:v24,:v36}{:奖牌金,:v12,:v24,:v36}{:奖牌铜,:v12,:v24,:v36}(->数据(分组人:奖牌)(映射(fn[[k v]])(进入{:奖牌k}(应用合并+)(映射)#(dissoc%:emdal)v‘‘‘‘‘‘))-这是可行的,尽管我需要找到一种方法来删除实际数据集中的空值
(apply (partial merge-with #(map + %1 %2)) data)