Guest User

Untitled

a guest
Jan 21st, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.24 KB | None | 0 0
  1. (ns clj-playground.enzyme-selection
  2. (:require [clojure.data.csv :as csv]
  3. [clojure.java.io :as io]))
  4.  
  5. (defn read-enzyme-data
  6. "Read clone/analysis/enzyme data from CSV file filename. Group
  7. enzymes for each clone/analysis pair into a set and return a list of
  8. sets of enzymes"
  9. [filename]
  10. (with-open [in-file (io/reader filename)]
  11. (let [records (csv/read-csv in-file)
  12. colnames (map keyword (first records))]
  13. (loop [records (next records) accum {}]
  14. (if records
  15. (let [r (zipmap colnames (first records))
  16. k (str (:clone_name r) "." (:analysis r))]
  17. (recur (next records) (assoc accum k (conj (get accum k #{}) (:enzyme r)))))
  18. (vals accum))))))
  19.  
  20. (defn min-enzyme-set
  21. "Find a minimal set of enzymes containing at least one enzyme from
  22. every set in enzyme-sets"
  23. ([enzyme-sets]
  24. (min-enzyme-set enzyme-sets #{}))
  25. ([enzyme-sets accum]
  26. (if (seq enzyme-sets)
  27. (let [enzyme-freqs (frequencies (apply concat enzyme-sets))
  28. most-popular-enzyme (reduce (fn [x y] (if (> (enzyme-freqs x) (enzyme-freqs y)) x y)) (keys enzyme-freqs))]
  29. (recur (remove #(contains? % most-popular-enzyme) enzyme-sets) (conj accum most-popular-enzyme)))
  30. accum)))
Add Comment
Please, Sign In to add comment