[一天一點R]資料前處理-購物車資料型態萃取
今天要跟大家分享,拿到購物車資料型態的話該怎麼做資料前處理。
什麼是購物車資料格式?
購物車資料格式,像買東西一樣,然後包成一包,帶走的概念,在資料庫裏面,大多數的工程師在網頁設計時,資料常常會塞在同一個欄位中紀錄下來,例如下表的形式,每一個購物事件就是一個欄位,記錄每個客戶每一次的購買情形,其中通常都會有一個欄位為,購買內容,就會把所有這次的購買品項全部記錄在一個欄位中,用一些特殊的符號隔開,平常比較常用的是,(逗號)。

這時,你心理會有一個疑問?
為什麼我會拿到購物車資料型態萃取資料?
在資料分析的過程中,由於資料庫的設計常常是為了業務需求設計,不是為了資料分析而設計的,所以我常常會拿到下列類似的資料
收到資料後,如果你進一步詢問業務端,透過這些資料了解甚麼面向的問題?通常第一個問題….
我想要知道2月份裡面哪一個品項賣得最好?
要回答這個問題,首先,要先把資料進行轉換,必須把把購物內容欄位資料分別以不同的品項萃取出來,因此,在找合適的R套件與函數前,必須先規劃好資料分析所需要的資料格式,由於要算出2月份哪個一個品項購買的數量最多,因此我把資料格式設計如下:

怎樣找到合適的函數與語法可以把購物內容欄位資料分別以不同的品項萃取出來?
通常我會在google上面,用英文關鍵字去找相關的訊息,以這個例子而言,我在google上面打入"R separate comma string into different rows",通常處理的方式有兩種:
(1)strsplit語法
首先,透過strsplit 將一個字串分割成多個字串,strsplit 函數,第一個參數是輸入字串,而第二個參數則是分隔字串符號,然後存成另一個變數命名為"各品項",搭配unnest把巢狀的欄位格式給拆解開來,
data<-read.csv(“購物明細範例.csv”,header=TRUE)
colnames(data)
data %>%
mutate(各品項 = strsplit(as.character(購買內容), “,”)) %>%
unnest(各品項) #packages:tidyr就可以把資料萃取出來的形式如下圖:

(2)separate_rows函數
然而,如果你現在要處理的資料格式,除了購買明細,還有對應紀錄的購買數量的話(如下圖),

就可以透過separate_rows來處理,避免有多個巢狀的欄位的話,就比須每一個巢狀的欄位都需要重複執行strsplit的過程,separate_rows有很直覺的設計, 第一個參數為資料集(data frame),第二個參數為要處理的Col(巢狀欄位),第三個則為分隔符號,如果有多個巢狀欄位,則可以根據需求增加。
data2<-read.csv(“購物明細範例_明細_數量.csv”,header=TRUE)
colnames(data2)
b<-separate_rows(data2,購買內容,購買數量)透過上面的程式碼,得到的畫面如下:

今天就跟大家分享資料前處理的小技巧,透過這樣的方式,就可以輕輕鬆鬆萃取出購物車式的欄位資料(對應式巢狀的欄位資料),程式畫面很簡潔,語法使用上也很直覺,推薦大家separate_rows函數,希望可以縮短大家在資料前處理的所需要花費的時間,下次再見囉~
參考資料 :
1.
2.