6 資料處理利器:dplyr

接著我們要介紹的是 dplyr() 套件,相較於原生的資料處理語法,dplyr() 套件中融入很多概念與結構化查詢語言(Structured Query Language,SQL)相仿的函數。搭配 %>% 運算子一起使用,能夠讓我們整理資料的能力獲得一個檔次的提升!

6.1 安裝與載入

使用之前,必須要安裝和載入 dplyr 這個套件:

# 安裝 dplyr 套件 ---------
install.packages("dplyr")
# 安裝 dplyr 套件 ---------
library(dplyr)

6.2 常用函數

我們將 dplyr() 套件提供的常用函數整理如下表:

函數 用途
filter() 篩選符合條件的觀測值
select() 選擇變數
mutate() 新增衍生變數
arrange() 依照變數排序觀測值
summarise() 聚合變數
group_by() 依照類別變數分組,常搭配 summarise() 函數

6.3 gapminder 資料

我們要使用 dplyr 套件處理的資料源自於一個非常有名的 TED 演講:

The best stats you’ve ever seen

The best stats you’ve ever seen

或者可以看一個簡短版的 BBC 剪輯:

Hans Rosling’s 200 Countries, 200 Years, 4 Minutes - The Joy of Stats

Hans Rosling’s 200 Countries, 200 Years, 4 Minutes - The Joy of Stats

在 R 語言中 gapminder 資料可以透過安裝載入 gapminder 套件獲得:

# 安裝 gapminder 套件 ---------
install.packages("gapminder")
# 載入 gapminder 套件 ---------
library(gapminder)

6.4 檢視 gapminder 資料

透過 head()str() 檢視 gapminder 資料:

# 載入 gapminder 套件 ---------
library(gapminder)
# 檢視 gapminder 資料
head(gapminder)
## # A tibble: 6 x 6
##       country continent  year lifeExp      pop gdpPercap
##        <fctr>    <fctr> <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan      Asia  1952  28.801  8425333  779.4453
## 2 Afghanistan      Asia  1957  30.332  9240934  820.8530
## 3 Afghanistan      Asia  1962  31.997 10267083  853.1007
## 4 Afghanistan      Asia  1967  34.020 11537966  836.1971
## 5 Afghanistan      Asia  1972  36.088 13079460  739.9811
## 6 Afghanistan      Asia  1977  38.438 14880372  786.1134
str(gapminder)
## Classes 'tbl_df', 'tbl' and 'data.frame':    1704 obs. of  6 variables:
##  $ country  : Factor w/ 142 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ continent: Factor w/ 5 levels "Africa","Americas",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ year     : int  1952 1957 1962 1967 1972 1977 1982 1987 1992 1997 ...
##  $ lifeExp  : num  28.8 30.3 32 34 36.1 ...
##  $ pop      : int  8425333 9240934 10267083 11537966 13079460 14880372 12881816 13867957 16317921 22227415 ...
##  $ gdpPercap: num  779 821 853 836 740 ...

6.5 篩選符合條件的觀測值

filter() 函數中我們輸入要篩選的資料框,以及依據什麼條件進行篩選,舉例來說我們可以將 gapminder 中 2007 年的資料篩選出來:

library(gapminder)
library(dplyr)
library(magrittr)
gapminder %>%
  filter(year == 2007)
## # A tibble: 142 x 6
##        country continent  year lifeExp       pop  gdpPercap
##         <fctr>    <fctr> <int>   <dbl>     <int>      <dbl>
##  1 Afghanistan      Asia  2007  43.828  31889923   974.5803
##  2     Albania    Europe  2007  76.423   3600523  5937.0295
##  3     Algeria    Africa  2007  72.301  33333216  6223.3675
##  4      Angola    Africa  2007  42.731  12420476  4797.2313
##  5   Argentina  Americas  2007  75.320  40301927 12779.3796
##  6   Australia   Oceania  2007  81.235  20434176 34435.3674
##  7     Austria    Europe  2007  79.829   8199783 36126.4927
##  8     Bahrain      Asia  2007  75.635    708573 29796.0483
##  9  Bangladesh      Asia  2007  64.062 150448339  1391.2538
## 10     Belgium    Europe  2007  79.441  10392226 33692.6051
## # ... with 132 more rows

6.6 選擇變數

select() 函數中我們輸入資料框的名稱,以及想要選取的變數名稱,舉例來說我們可以將 gapminder 中的 country 篩選出來:

gapminder %>%
  filter(year == 2007) %>%
  select(country)
## # A tibble: 142 x 1
##        country
##         <fctr>
##  1 Afghanistan
##  2     Albania
##  3     Algeria
##  4      Angola
##  5   Argentina
##  6   Australia
##  7     Austria
##  8     Bahrain
##  9  Bangladesh
## 10     Belgium
## # ... with 132 more rows

6.7 新增衍生變數

利用 mutate() 函數新增衍生變數,舉例來說,我們要在 gapminder 資料框中新增衍生變數 pop_in_thousands

gapminder %>%
  mutate(pop_in_thousands = pop / 1000)
## # A tibble: 1,704 x 7
##        country continent  year lifeExp      pop gdpPercap pop_in_thousands
##         <fctr>    <fctr> <int>   <dbl>    <int>     <dbl>            <dbl>
##  1 Afghanistan      Asia  1952  28.801  8425333  779.4453         8425.333
##  2 Afghanistan      Asia  1957  30.332  9240934  820.8530         9240.934
##  3 Afghanistan      Asia  1962  31.997 10267083  853.1007        10267.083
##  4 Afghanistan      Asia  1967  34.020 11537966  836.1971        11537.966
##  5 Afghanistan      Asia  1972  36.088 13079460  739.9811        13079.460
##  6 Afghanistan      Asia  1977  38.438 14880372  786.1134        14880.372
##  7 Afghanistan      Asia  1982  39.854 12881816  978.0114        12881.816
##  8 Afghanistan      Asia  1987  40.822 13867957  852.3959        13867.957
##  9 Afghanistan      Asia  1992  41.674 16317921  649.3414        16317.921
## 10 Afghanistan      Asia  1997  41.763 22227415  635.3414        22227.415
## # ... with 1,694 more rows

6.8 依照變數排序觀測值

利用 arrange() 函數依指定的變數來排序觀測值,舉例來說以 year 變數來排序 gapminder

gapminder %>%
  arrange(year)
## # A tibble: 1,704 x 6
##        country continent  year lifeExp      pop  gdpPercap
##         <fctr>    <fctr> <int>   <dbl>    <int>      <dbl>
##  1 Afghanistan      Asia  1952  28.801  8425333   779.4453
##  2     Albania    Europe  1952  55.230  1282697  1601.0561
##  3     Algeria    Africa  1952  43.077  9279525  2449.0082
##  4      Angola    Africa  1952  30.015  4232095  3520.6103
##  5   Argentina  Americas  1952  62.485 17876956  5911.3151
##  6   Australia   Oceania  1952  69.120  8691212 10039.5956
##  7     Austria    Europe  1952  66.800  6927772  6137.0765
##  8     Bahrain      Asia  1952  50.939   120447  9867.0848
##  9  Bangladesh      Asia  1952  37.484 46886859   684.2442
## 10     Belgium    Europe  1952  68.000  8730405  8343.1051
## # ... with 1,694 more rows

6.9 聚合變數

summarise() 函數中我們輸入想要聚合的變數名稱與聚合公式,聚合運算的結果通常是一個數字,代表某個數列的運算結果,像是總和平均數標準差都是聚合運算的結果,舉例來說,我們可以運算 gapminder ˋ中 2007 年全球的人口數:

gapminder %>%
  filter(year == 2007) %>%
  summarise(ttl_pop = sum(as.numeric(pop)))
## # A tibble: 1 x 1
##      ttl_pop
##        <dbl>
## 1 6251013179

6.10 依照類別變數分組

聚合函數的運算常常會搭配 group_by() 函數一起使用,這時我們就可以整合 %>% 運算子,舉例來說,我們可以計算 gapminder 中 2007 年各洲的人口數:

gapminder %>%
  filter(year == 2007) %>%
  group_by(continent) %>%
  summarise(ttl_pop = sum(as.numeric(pop)))
## # A tibble: 5 x 2
##   continent    ttl_pop
##      <fctr>      <dbl>
## 1    Africa  929539692
## 2  Americas  898871184
## 3      Asia 3811953827
## 4    Europe  586098529
## 5   Oceania   24549947