《Using OpenRefine》翻譯~10

上一篇:《Using OpenRefine》翻譯~9

第三章:高級數據操作

上一章中,我們介紹了OpenRefine的一些基本的操作。然而這些僅僅提供了你初級的數據分析處理技能。只有OpenRefine高級特性才能讓你領略其真正的強大之處,本章就將介紹這些內容:

• 點1:對多值單元格的處理

• 點2:行模式和記錄模式的轉換

• 點3:相似單元格聚類

• 點4:單元格值轉換

• 點5:增加源列

• 點6:拆分列

• 點7:行列轉換

以上要點你可以自由選擇學習。在本章學習前,你需要使用已經清理過的數據集,這可以在PACKT網站下載。學習這些要點中的任何部分都可以讓你成爲OpenRefine高級用戶。但是請注意:有些數據操作特別重要。

 

 

1:對多值單元格的處理

在很多表格數據中有一個普遍的問題:如果一個單元格中有多個值怎麼辦?舉個例子,如果有一張包含名字、地址、電話號碼的客戶信息表格。錄入人員正在對這張表格進行信息錄入,當其發現有一個名字爲Mr.Thompson的人有兩個地址信息,並且每個地址信息對應一個電話號碼,一般情況下錄入人員會選擇下面三種可能的操作:

• 只增加一個地址信息:這是最簡單的做法,這減少了一般的錄入工時。但是,這也意味着丟失了一般的信息,所以表格信息完整性被降低了。

• 增加兩行:雖然現在表格信息是完整了,但是數據卻出現了冗餘。數據冗餘也不好,因爲這很容易導致錯誤:這兩行可能會被認爲是兩個不同的都叫Mr.Thompson的人的信息,但如果這是Mr.Thompson不同時間所留下的信息,就容易導致錯誤。另外,因爲這兩行沒有什麼聯繫,如果其中一行信息被更新了,另一行並不能自動更新。

• 在一行中添加所有信息:這種情況下,兩個地址信息和兩個電話信息都被添加到對應字段中一個單元格內。但是對於原先字段的定義來說,我們這樣操作可以說是信息超載了。當然這樣操作對於信息來說是符合完整和非冗餘,但是也會有個問題。對於我們人類來說我們可以毫不費力的識別出這些信息含義,但是計算機卻做不到。想象下一個寫信的人在信封上寫了兩個不同的地址;或者是一臺自動撥號機,其是通過將一個單元格的所有內容作爲一個電話號碼來進行撥出。上面兩種情況都會產生錯誤。所以字段確實丟失了語義上的精確性。

雖然我們知道我們有很多種技術方法可以解決多值單元格問題,比如表格關聯。但是,如果數據模型你不能控制,那麼你也就只能選擇上面三種中的一種。

幸運的是,OpenRefine可以做到多值單元格的識別。當然因爲OpenRefine是一種自動化軟件,所以其需要在操作前指定某個字段爲multi-valued多值字段。在Powerhouse Museum數據集中,Categories列就包含多值單元格,因爲其單元格內容可以屬於不同的分類。在我們進行操作前,我們必須告訴OpenRefine這個字段是有點不同的。

假如我們想了解Categories列中究竟有多少不同的分類,並且哪個分類數量最多。那麼首先讓我們看看,如果我們對Categories進行文本透視會發生什麼(Facet| Text Facet),如下圖所示。你可能會記得我們在第二章:分析和修改數據中的經歷,這樣做並不有效,因爲會出現太多的分類。對於OpenRefine來說,其會提示“總共有14,805個分類,數量超出了現實範圍”。當然你可以通過點擊Set choice count limit.來增加最大顯示數,但是我們強烈建議你不要這麼做。因爲首先這可能導致OpenRefine運行變慢。其次,OpenRefine也只會直接列出多值分類內容(比如Hen eggs|Sectional models|Animal Samples and Products)。這無法讓我們瞭解所有單獨的分類內容,而我們感興趣的恰恰在此。

爲了解決這個問題,我們先不要關閉左側透視窗口,選擇Categories下拉菜單:Edit Cells | Split multi-valued cells…,如下圖所示:


OpenRefine現在提示What separator currently separates the values?(分隔符是什麼?)。我們可以從最初幾行看出,值是被管道符分隔,也就是我們講的垂直線。因此,我們在對話框中輸入“|”。如果你在鍵盤中找不到這個符號,那也可以在單元格中複製然後粘貼到對話框中,然後點擊OK.

幾秒鐘後,你可以看到OpenRefine已經分割好了單元格值,並且對Categories的透視界面也刷新了,顯示了單獨的分類。默認情況下是按照字母順序顯示的,如果我們按照頻數顯示的話我們能夠獲得更加有用的信息。我們可以將Sort by 選項從name改爲count。這樣我們就能夠發現出現數最多的分類。

下面還需要做的是那些還沒有變爲單值的分類,我們需要將分類名稱修改下,這樣所有的行都會更新。比如,修改分類名Clothing and Dress,在透視界面中移動到該分類名上方,點擊edit,如下圖所示:


輸入一個新的名稱比如Clothing,然後點擊Apply。OpenRefine 就會把所有Clothing and Dress名稱修改爲Clothing。並且透視界面也立即刷新了。

一旦你已經將分開的值編輯好了,那麼你可以把他們重新組合在一起。點擊Categories列的菜單:Edit cells |Join multi-valued cells…,然後輸入你想要得分隔符。這次的分隔符並不一定要和原來的相同,有很多字符可以使用。比如,你可以使用逗號後面跟一個空格來做分隔符。

 

 

2:行模式和記錄模式的轉換

現在讓我們看下OpenRefine是如何處理多值單元格的。當我們按照上一點的操作步驟對一個列進行了分割後,我們發現OpenRefine做了兩件事情。一方面,多值內容中的第一部分被替換放回原來的位置,另一方面,剩下的值被放到下一空行中對應的位置。舉個例子,如下圖所示,你可以看到ID7-ID9的記錄基本是空行,只有Categories對應的單元格有內容,只有第一行(ID6)中其他單元格內有內容(ID6):


 

row是指數據集中的一行。

Record包括一個主體中的所有行。第一行所有單元格非空,標識一條記錄;後續行中相同內容爲空,表示這些行隸屬於同一條記錄

雖然這種處理方式避免了信息的重複和錯誤,但是也使得比較難分辨隸屬於哪個主體。比如,如果我們對Categories列進行了文本透視(參照前一點),我們可以點擊每個類別名稱來看究竟有哪些行屬於這個分類。但是,如果我們這麼做的話,我們會發現許多空行:


產生上圖結果的原因是:OpenRefine其實確實顯示了所有分類值爲Numismatics的行,這些行中包括那些Numismatics不是首個分類名稱的行。但是對於某個主體中的其他行卻並沒有包括。這在我們關注某個主體中的所有行時就會產生問題。比如,我們可能想對所有類別爲Numismatics的行進行標星操作,從而想對其進行後續操作時就會產生問題,我們可以試着這麼做然後看看發生什麼情況。

選中文本透視視圖中的Numismatics,點擊ALL下拉菜單中Edit rows | Star rows,然後點擊文本透視視圖中的reset來看看發生什麼情況。我們發現只有值爲Numismatics的行被標星了,而隸屬於主體的其他行卻並沒有被標星。很顯然我們丟失了信息。所以,讓我們通過Undo / Redo標籤頁撤銷標星操作。

OpenRefine可以讓我們將隸屬於同一個主體的所有行集合成一個單獨的record(記錄)。這樣做的話,可以讓我們在分割多值單元格的同時確保這些行還能夠被認爲是一個整體。我們可以在Show as 中將rows 改成records。你立即會發現行中顏色的改變。其會從以每個row進行顏色區隔變爲以每個record進行顏色區隔。

如果我們在records模式中,在Categories透視圖中選中Numismatics,我們可以發現包含Numismatics的所有主體都被選中了。如果我們通過ALL下的Edit

rows |Star rows進行標星,我們發現所有包含Numismatics的主體都被標星了。


以上說明,在records模式下,操作對整條記錄有效,記錄起碼是一行以上。總結下,我們可以這麼說,rows模式只是各個獨立的行,而records模式則是一個整體,可以包含數行。

多參數下的記錄匹配

如果你想匹配既在目錄名稱爲Numismatics中又在目錄名稱Medals中的記錄該怎麼辦呢?爲了做到這點,首先請確保我們在records模式下,然後我們對Categories進行透視,首先我們選擇Numismatics,然後再做一次透視,這次選擇Medals,這樣我們就獲取到了我們想要的記錄。

現在如果切換回rows模式會怎麼樣呢?突然,沒有記錄獲得匹配。你起初可能感到疑惑,但其實很正常:沒有一行是同時既等於Numismatics又等於Medals的,每一行最多隻有這兩項中的一項。因此,多重選擇必須在records模式下。

另外請注意,本書其他章節請切換到rows模式,否則可能出錯。如果出現不可預料的錯誤,請先檢查下模式是否正確。這能減少很多麻煩。



下一篇:《Using OpenRefine》翻譯~11

發佈了15 篇原創文章 · 獲贊 16 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章