介紹 tidyr 套件中四款基本資料整理函數,包括gather(), spread(), separate(), unite()。其中gather()和spread()功能互補,一個將「寬」資料堆疊成「長」資料,另一個則將「長」資料擴展為「寬」資料。而separate()和unite()則是用做分裂或合併變數。
tidyr package
本學習筆記會介紹 tidyr 套件所提供數據整理的基本四種功能,包括:
- gather(): 將「寬」資料變「長」
- spread(): 將「長」資料變「寬」
- separate(): 將單一欄位切分成多個欄位
- unite(): 將多個欄位合併成單一欄位
以下載入所需套件 tydyr和dplyr
1 2 |
library(tidyr) library(dplyr) |
%>% Operator
1 |
library(magrittr) |
雖然非必要,但套件tidyr和dplyr都會使用magrittr套件中的pipe operator %>%,可以方便快速的串接多行指令。該運算元會將前一個指令或函數運算所產生的結果投入下一個指令或函數,比如說,在篩選資料時的指令:
filter(data, variable == numeric_value)
or
data %>% filter(variable == numeric_value)
以上兩者的結果會是一樣的。
gather() function
目的: 將「寬」資料重塑成「長」資料
說明: 有時會遇到資料沒有妥當堆疊,諸多感興趣的共同屬性分在多個欄位,此時就需要將這些感興趣的共同屬性重新聚合成單一變數,透過gather()函數,可將多個欄位折疊為成對的key-value。比如說:
1 2 |
# original data frame df |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
## # A tibble: 12 x 6 ## Group Year Qtr.1 Qtr.2 Qtr.3 Qtr.4 ## 1 1 2006 15 16 19 17 ## 2 1 2007 12 13 27 23 ## 3 1 2008 22 22 24 20 ## 4 1 2009 10 14 20 16 ## 5 2 2006 12 13 25 18 ## 6 2 2007 16 14 21 19 ## 7 2 2008 13 11 29 15 ## 8 2 2009 23 20 26 20 ## 9 3 2006 11 12 22 16 ## 10 3 2007 13 11 27 21 ## 11 3 2008 17 12 23 19 ## 12 3 2009 14 9 31 24 |
1 2 |
long_df % gather(key = Quarter, value = Revenue, Qtr.1:Qtr.4) head(long_df,24) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
## # A tibble: 24 x 4 ## Group Year Quarter Revenue ## 1 1 2006 Qtr.1 15 ## 2 1 2007 Qtr.1 12 ## 3 1 2008 Qtr.1 22 ## 4 1 2009 Qtr.1 10 ## 5 2 2006 Qtr.1 12 ## 6 2 2007 Qtr.1 16 ## 7 2 2008 Qtr.1 13 ## 8 2 2009 Qtr.1 23 ## 9 3 2006 Qtr.1 11 ## 10 3 2007 Qtr.1 13 ## # ... with 14 more rows |
而以下指令亦可產生相同結果
1 2 3 4 |
df %>% gather(Quarter, Revenue, Qtr.1:Qtr.4) df %>% gather(Quarter, Revenue, -Group, -Year) df %>% gather(Quarter, Revenue, 3:6) df %>% gather(Quarter, Revenue, Qtr.1, Qtr.2, Qtr.3, Qtr.4) |
separate() function
目的: 將單一變數一切為二
說明: 很多時候單一變數欄位會包含多個變數,或是部分變數你不感興趣,如以下範例:
1 2 3 4 5 6 7 8 9 10 11 12 |
## # A tibble: 9 x 5 ## Grp_Ind Yr_Mo City_State First_Last Extra_variable ## 1 1.a 2006_Jan Dayton (OH) George Washington XX01person_1 ## 2 1.b 2006_Feb Grand Forks (ND) John Adams XX02person_2 ## 3 1.c 2006_Mar Fargo (ND) Thomas Jefferson XX03person_3 ## 4 2.a 2007_Jan Rochester (MN) James Madison XX04person_4 ## 5 2.b 2007_Feb Dubuque (IA) James Monroe XX05person_5 ## 6 2.c 2007_Mar Ft. Collins (CO) John Adams XX06person_6 ## 7 3.a 2008_Jan Lake City (MN) Andrew Jackson XX07person_7 ## 8 3.b 2008_Feb Rushford (MN) Martin Van Buren XX08person_8 ## 9 3.c 2008_Mar Unknown William Harrison XX09person_9 |
在這個範例中,我們目標是希望將每個變數字串分離。可以使用separate()函數來達成此目標,將單一字串變數拆分成多個欄位。
1 2 3 4 5 6 7 |
separate_df df2 %>% separate(col = Yr_Mo, into = c("Year","Month")) %>% separate(col = City_State, into = c("City","State"), sep = " \\(") %>% mutate(State = gsub(pattern = "\\)",replacement = "",x = State)) %>% separate(col = First_Last, into = c("First", "Last")) head(separate_df) |
1 2 3 4 5 6 7 8 9 |
## # A tibble: 6 x 8 ## Grp_Ind Year Month City State First Last Extra_variable ## 1 1.a 2006 Jan Dayton OH George Washington XX01person_1 ## 2 1.b 2006 Feb Grand Forks ND John Adams XX02person_2 ## 3 1.c 2006 Mar Fargo ND Thomas Jefferson XX03person_3 ## 4 2.a 2007 Jan Rochester MN James Madison XX04person_4 ## 5 2.b 2007 Feb Dubuque IA James Monroe XX05person_5 ## 6 2.c 2007 Mar Ft. Collins CO John Adams XX06person_6 |
而以下指令亦可產生相同效果
1 2 3 4 5 |
df2 %>% separate(col = Yr_Mo, into = c("Year","Month")) df2 %>% separate(col = Yr_Mo, into = c("Year","Month"), sep = "_") df2 %>% separate(col = First_Last, into = c("First", "Last")) df2 %>% separate(col = First_Last, into = c("First", "Last"), sep = " ") |
unite() function:
目的: 將兩個變數合併為一
說明: 很多時候會想將兩個變數合併成一個新的變數,此時就可透過unite()函數來達成(與separate()為互補函數),如以下範例:
separate_df
1 2 3 4 5 6 7 |
unite_df separate_df %>% unite(col = City_State, City, State, sep = " (") %>% mutate(City_State = paste(City_State,")", sep = "")) %>% unite(Year_Month, Year, Month, sep = "_") %>% unite(First_Last, First, Last, sep = " ") head(unite_df) |
1 2 3 4 5 6 7 8 9 |
## # A tibble: 6 x 5 ## Grp_Ind Year_Month City_State First_Last Extra_variable ## 1 1.a 2006_Jan Dayton (OH) George Washington XX01person_1 ## 2 1.b 2006_Feb Grand Forks (ND) John Adams XX02person_2 ## 3 1.c 2006_Mar Fargo (ND) Thomas Jefferson XX03person_3 ## 4 2.a 2007_Jan Rochester (MN) James Madison XX04person_4 ## 5 2.b 2007_Feb Dubuque (IA) James Monroe XX05person_5 ## 6 2.c 2007_Mar Ft. Collins (CO) John Adams XX06person_6 |
而以下指令亦可產生相同效果
1 2 3 |
# 如果沒有指定sep,則會預設使用"_" separate_df %>% unite(Year_Month, Year, Month) separate_df %>% unite(Year_Month, Year, Month, sep = "_") |
spread() function:
目的: 將「長」資料重塑成「寬」資料
說明: 有時會我們會需要將長的資料轉換成寬的資料,spread()函數則能將指定的成對key-value擴展成多個欄位(是gather()函數的互補函數)。
1 2 |
wide_df % spread(key = Quarter, value = Revenue) head(wide_df) |
1 2 3 4 5 6 7 8 9 |
## # A tibble: 6 x 6 ## Group Year Qtr.1 Qtr.2 Qtr.3 Qtr.4 ## 1 1 2006 15 16 19 17 ## 2 1 2007 12 13 27 23 ## 3 1 2008 22 22 24 20 ## 4 1 2009 10 14 20 16 ## 5 2 2006 12 13 25 18 ## 6 2 2007 16 14 21 19 |
更多資料處理學習筆記:
參考資料連結: