13  Mode

(def numbers [1 2 2 3 3 3 4 4 4 4 5 5 5 5 5])
numbers
[1 2 2 3 3 3 4 4 4 4 5 5 5 5 5]
(frequencies numbers)
{1 1, 2 2, 3 3, 4 4, 5 5}
(sort-by second (frequencies numbers))
([1 1] [2 2] [3 3] [4 4] [5 5])
(last (sort-by second (frequencies numbers)))
[5 5]
(first (last (sort-by second (frequencies numbers))))
5
(defn mode [numbers]
  (first (last (sort-by second (frequencies numbers)))))
(mode numbers)
5
(mode [1 2 3 4 5 6])
6

Fixing the mode function

(defn mode [numbers]
  (let [freqs (frequencies numbers)
        max-freq (apply max (vals freqs))]
    (filter #(= (second %) max-freq) freqs)))
(mode numbers)
([5 5])
(mode [1 2 3 4 5 6])
([1 1] [2 1] [3 1] [4 1] [5 1] [6 1])

Extracting values from the mode function

(map first (mode numbers))
(5)
(map first (mode [1 2 3 4 5 6]))
(1 2 3 4 5 6)
(defn mode [numbers]
  (let [freqs (frequencies numbers)
        max-freq (apply max (vals freqs))]
    (map first (filter #(= (second %) max-freq) freqs))))
(mode numbers)
(5)
(mode [1 2 3 4 5 6])
(1 2 3 4 5 6)
(mode [1 1 2 2 3 3])
(1 2 3)

Return number if only single mode is present

(defn mode [numbers]
  (let [freqs (frequencies numbers)
        max-freq (apply max (vals freqs))]
    (if (= (count (filter #(= (second %) max-freq) freqs)) 1)
      (first (first (filter #(= (second %) max-freq) freqs)))
      (map first (filter #(= (second %) max-freq) freqs)))))
(mode [1 2 3 4 5 6])
(1 2 3 4 5 6)
(mode [3 1 1 2 2 3 3])
3
source: notebooks/mode.clj