如何在舊有資料上產生新的行(column)?
(defn ex-1-26 []
(->> (load-data :uk-scrubbed)
(i/add-derived-column :victors [:Con :LD] +)))
但是此函數會抱錯。原因在於有部分的資料是以 java.lang.String
物件儲存,而有部分是以 java.lang.Double
儲存。通過下列計算可以看出具體數量:
(->> (load-data :uk-scrubbed)
($ "Con")
(map type)
(frequencies))
;; {java.lang.Double 631, java.lang.String 19}
(->> (load-data :uk-scrubbed)
($ "LD")
(map type)
(frequencies))
;; {java.lang.Double 631, java.lang.String 19}
讓我們用一開始介紹的 i/$where
來看看這些資料的具體狀況:
(defn ex-1-27 []
(->> (load-data :uk-scrubbed)
(i/$where #(not-any? number? [(% "Con") (% "LD")]))
(i/$ [:Region :Electorate :Con :LD])))
;; | Region | Electorate | Con | LD |
;; |------------------+------------+-----+----|
;; | Northern Ireland | 60204.0 | | |
;; | Northern Ireland | 73338.0 | | |
;; | Northern Ireland | 63054.0 | | |
;; ...
原來是因為該資料格為空白!**那我們應該過濾掉這些行,或者是填充為 0 呢?(filtered or assumed to be zero?)**在此資料情境下,填充為 0 會使得分析的強度下降,所以我們過濾掉這幾行。我們創建一個新的過濾後表格,並同時新增我們所需要的資料:
(defmethod load-data :uk-victors [_]
(->> (load-data :uk-scrubbed)
(i/$where {:Con {:$fn number?} :LD {:$fn number?}})
(i/add-derived-column :victors [:Con :LD] +)
(i/add-derived-column :victors-share [:victors :Votes] /)
(i/add-derived-column :turnout [:Votes :Electorate] /))
於是我們有了三個新的行,與勝選人在此選區的得票比例有關係的數據::victors
、:victors-share
、turnout
。所以我們可以用 Q-Q plot 來觀察這些變數之間的關聯!