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 演講:
或者可以看一個簡短版的 BBC 剪輯:
在 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