1

以下のデータを「ピボット」しようとしていますが、これを Excel で試してもうまくいかないようです。ロジックが正しいかどうかはわかりません。基本的に、データセット a をデータセット b に変換する必要があります。

日付 メダル VALUE1 VALUE2 VALUE3 VALUE4

2013-03-08 シルバー 0 6052 0 0

2013-03-04 ブロンズ 0 0 0 0

2013-03-04 ブロンズ 0 0 0 0

2013-03-04 ブロンズ 0 0 0 0

2013-03-04 ブロンズ 0 1437 0 0

2013-03-01 ブロンズ 0 0 240 0

2013-03-01 シルバー 0 0 0 0

2013-03-01 ブロンズ 0 0 0 0

2013-03-01 ブロンズ 0 173 0 0

2013-03-08 シルバー 0 0 0 271

2013-03-04 シルバー 0 2547 0 0

2013-03-04 ブロンズ 0 495 0 0

2013-03-04 ゴールド 279 0 0 0

2013-03-02 シルバー 0 0 0 0

2013-03-01 ブロンズ 0 0 0 0

2013-03-01 シルバー 0 0 0 0

2013-03-01 ブロンズ 0 0 0 0

2013-03-01 ブロンズ 0 20 0 0

2013-03-03 シルバー 0 0 0 0

B

メダル VALUE1 VALUE2 VALUE3 VALUE4

ブロンズ 0 2125 240 0

ゴールド 279 0 0 0

シルバー 0 8599 0 271

したがって、基本的には、MEDAL でグループ化し、MEDAL フィルターに基づいて各値列を合計しようとしています (MEDAL は可変で、PURPLE、BLUE などの可能性があります)。以下の試みは完全に間違っています。以前のコードを再利用しているため、おそらく丸いペグの四角い穴の領域ですが、論理的にもどうすればいいのかわかりません... :(

どんな助けやアドバイスも大歓迎です

(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)

                 })))

        ))  
4

3 に答える 3

0
(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}}
于 2013-04-18T09:11:46.877 に答える
0

データを次の構造に変換します。

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

(apply (partial merge-with #(map + %1 %2)) data)
于 2013-04-18T09:37:23.463 に答える
0

merge-with がきちんとした解決策の鍵になると思います。

データがベクトルであるとすると、次のようになります。

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

少し折りたたむためのより良い方法があるはずですが、これが正しい軌道に乗ることを願っています.

于 2013-04-18T08:47:43.337 に答える