(require '[huri.core :as h] '[clojure.core.matrix.dataset :as d] '[incanter.core :as i]) (def ds [{:id 1.0 :name "name1"} {:id 2.0 :name "name2"} {:id 3.0 :name "name3"}]) ;; UPDATE THE :NAME COLUMN IN THE DATASET ;; - IF THE VALUE IS NOT "NAME2", THEN CHANGE TO "NOT 2" ;; ;; EXPECTED OUTPUT: ;; | :id | :name | ;; |-----+-------| ;; | 1.0 | not 2 | ;; | 2.0 | name2 | ;; | 3.0 | not 2 | ;; WITH CLOJURE.CORE/UPDATE (def d1 (map (fn [x] (update x :name #(if (= "name2" %) % "not 2"))) ds)) ;; WITH CLOJURE.CORE/UPDATE-IN (def d2 (map (fn [x] (update-in x [:name] #(if (= "name2" %) % "not 2"))) ds)) ;; WITH HURI/UPDATE-COLS (def d3 (h/update-cols {:name #(if (= "name2" %) % "not 2")} ds)) ;; WITH MATRIX.DATASET/EMAP-COLUMN (def d4 (-> ds (d/dataset) (d/emap-column :name #(if (= "name2" %) % "not 2")) ((comp #(map into %) d/row-maps)))) ;; WITH INCANTER/TRANSFORM-COL (def d5 (-> ds (i/to-dataset) (i/transform-col :name #(if (= "name2" %) % "not 2")) ((comp #(map into %) second vals))))
huri
Adding New Columns to Clojure Map
(require '[huri.core :as h] '[clojure.core.matrix.dataset :as d] '[incanter.core :as i]) (def ds [{:id 1.0 :name "name1"} {:id 2.0 :name "name2"} {:id 3.0 :name "name3"}]) ;; ADD 2 COLUMNS TO THE DATASET ;; - ADD 2 TO ID AND NAME ADD2 ;; - CHECK NAME = "name2" AND NAME NAME2 ;; ;; EXPECTED OUTPUT: ;;| :id | :name | :add2 | :name2 | ;;|-----+-------+-------+--------| ;;| 1.0 | name1 | 3.0 | N | ;;| 2.0 | name2 | 4.0 | Y | ;;| 3.0 | name3 | 5.0 | N | ;; WITH PLAIN CLOJURE ;; #1 - MERGE (def d1 (map #(merge % {:add2 (+ (:id %) 2) :name2 (if (= "name2" (:name %)) "Y" "N")}) ds)) ;; #2 - MERGE-WITH (def d2 (map #(merge-with into % {:add2 (+ (:id %) 2) :name2 (if (= "name2" (:name %)) "Y" "N")}) ds)) ;; #3 - ASSOC (def d3 (map #(assoc % :add2 (+ (:id %) 2) :name2 (if (= "name2" (:name %)) "Y" "N")) ds)) ;; #4 - CONJ (def d4 (map #(conj % {:add2 (+ (:id %) 2) :name2 (if (= "name2" (:name %)) "Y" "N")}) ds)) ;; #5 - CONCAT (def d5 (map #(into {} (concat % {:add2 (+ (:id %) 2) :name2 (if (= "name2" (:name %)) "Y" "N")})) ds)) ;; WITH HURI (def d6 (h/derive-cols {:name2 [#(if (= "name2" %) "Y" "N") :name] :add2 [#(+ 2 %) :id]} ds)) ;; WITH CORE.MATRIX API (def d7 (-> ds (d/dataset) (d/add-column :add2 (map #(+ 2 %) (map :id ds))) (d/add-column :name2 (map #(if (= "name2" %) "Y" "N") (map :name ds))) (d/row-maps))) ;; WITH INCANTER API (def d8 (->> ds (i/to-dataset) (i/add-derived-column :add2 [:id] #(+ 2 %)) (i/add-derived-column :name2 [:name] #(if (= "name2" %) "Y" "N")) ((comp second vals)))) ;; CHECK THE DATA EQUALITY (= d1 d2 d3 d4 d5 d6 d7 d8) ;; true
Transpose in Clojure
(require '[huri.core :as h] '[clojure.core.matrix.dataset :as d] '[incanter.core :as i]) ;; FROM MAP OF ROWS TO MAP OF COLUMNS (def byRow [{:x 1 :y "a"} {:x 2 :y "b"} {:x 3 :y "c"}]) ;; APPROACH #1 - PLAIN CLOJURE (zipmap (keys (first byRow)) (apply map list (map vals byRow))) ; {:x (1 2 3), :y ("a" "b" "c")} ;; APPROACH #2 - HURI LIBRARY (h/col-oriented byRow) ; {:x (1 2 3), :y ("a" "b" "c")} ;; APPROACH #3 - CORE.MATRIX LIBRARY (d/to-map (d/dataset (keys (first byRow)) byRow)) ; {:x [1 2 3], :y ["a" "b" "c"]} ;; APPROACH #4 - INCANTER LIBRARY (i/to-map (i/to-dataset byRow)) ; {:x (1 2 3), :y ("a" "b" "c")} ;; FROM MAP OF COLUMNS TO MAP OF ROWS (def byCol {:x '(1 2 3) :y '("a" "b" "c")}) ;; APPROACH #1 - PLAIN CLOJURE (map #(zipmap (keys byCol) %) (apply map list (vals byCol))) ; ({:x 1, :y "a"} {:x 2, :y "b"} {:x 3, :y "c"}) ;; APPROACH #2 - HURI LIBRARY (h/row-oriented byCol) ; ({:x 1, :y "a"} {:x 2, :y "b"} {:x 3, :y "c"}) ;; APPROACH #3 - CORE.MATRIX LIBRARY (d/row-maps (d/dataset (keys byCol) byCol)) ; [{:x 1, :y "a"} {:x 2, :y "b"} {:x 3, :y "c"}] ;; APPROACH #4 - INCANTER LIBRARY (second (vals (i/dataset (keys byCol) (apply map list (vals byCol))))) ; ({:x 1, :y "a"} {:x 2, :y "b"} {:x 3, :y "c"})