R資料處理
R資料處理(data
manipulation,wrangle)
|
||
溫馨的提醒:
setwd(): 設定工作路徑
rm(list=ls()): 清空Environment
|
載入資料之後,接下來就是資料整理(data
manipulation),現在比較潮的詞彙是資料角力(Data wrangling),將資料整理成合乎需求的格式。在這個單元裡,我們主要是介紹一個資料處理的利器:dplyr套件。此套件融入很多概念與結構化查詢語言(Structured
Query Language,SQL)相仿的函數。其又可與%>%
(pipe)運算子一起使用,可以很高效率的整理資料。Dplyr套件是tidyverse套件的一個子套件,下一單元的繪圖使用ggplot2也是tidyverse套件的子套件,因此,本單元安裝與載入tidyverse套件來做為資料處理的套件。
安裝與載入tidyverse套件
|
# 安裝 tidyverse 套件 install.packages("tidyverse") #到RStudio右下角,點選install,在視窗中輸入tidyverse,再按視窗中的install。 # 載入tidyverse 套件 library(tidyverse) #八個子套件被載入,其中我們可以看dplyr是1.0.2版。 # 載入資料 (利用RStudio的Import Dataset把elem資料載入) |
常用函數
dplyr套件常用函數如下表:
|
函數 |
用途 |
|
select() |
選擇變項 |
|
filter() |
篩選符合條件的觀測值 |
|
mutate() |
新增衍生變數 |
|
arrange() |
依照變數排序觀測值 |
|
summarise() |
聚合變數 |
|
group_by() |
依照類別變數分組,常搭配 summarise() 函數 |
選擇變項
如果我們要從elem的資料檔中選取姓名、身高、體重這三個變項,將其另存到新檔。就可以使用select()函數。
|
elem_1 <- elem %>% select(姓名, 身高, 體重) elem_1 #上面的意思是將elem資料檔傳送給select()函數, #請w它選出姓名、身高、體重三個#變項的資料, #然後指派給elem_1這個檔名的資料框。 #在RStudio的右上角看到elem_1這個檔案名,點下藍色圈圈, #就看到這三個變項已被選#取存到名為elem_1的資料框。 View(elem_1) #RStudio的右上視窗會秀出這個資料框給你看。 #接下來可以將其存成excel檔,以便日後使用。 #用openxlsx套件的write.xlsx() #第一次安裝openxlsx套件 install.packages("openxlsx")
library(openxlsx) write.xlsx(elem_1, file =
"elem_1.xlsx", firstActiveCol=2) #檔案會直接存在你所設定的路徑資料夾中。 #若沒有設定路徑資料夾,在file=” ”要寫存檔資料夾的路徑,例如:” D:/Rclass/….” |
NOTE:
安裝openxlsx套件,會出現以下訊息詢問是否將所有相關套件一併下載,按「是(Yes」會有比較長時間的等待安裝完成,按「否(N)」也可安裝,也可以執行儲存為xlsx格式檔案。
篩選觀察值
|
fa_elem <- elem %>% filter(父親教育 == "國小") fa_elem # 上面的意思是將elem資料檔傳遞過去,請filter幫忙抓取父親教育是國小的資料。 #接下來可以將其存成excel檔,以便日後使用。 library(openxlsx) write.xlsx(fa_elem, file = " fa_elem.xlsx", firstActiveCol=2) #----------------------------------------------------------------# df_and <- elem %>% filter(父親教育 == "國小" & 母親教育 == "國小") df_and #---------------------------------------------------------------------# df_or <- elem %>% filter(父親教育 == "國小" | 母親教育 == "國小") df_or #---------------------------------------------------------------------# df_160 <- elem %>% filter(身高>160) df_160 #--------------------------------------------------------------------# df_lio <- elem %>%
filter(grepl("^劉", 姓名)) df_lio #grepl()適用於抓取某個或某些字的函數, #劉的前面有個^(hat)符號是代表字首(字串的開頭)之意, #整段的意思是將elem資料檔傳送給filter()函數, #幫我篩選姓名這個變項中,字首是劉的資料。 #----------------------------------------------------------------------# df_lin <- elem %>%
filter(grepl("玲$", 姓名)) df_lin #很顯然地,$代表是字尾的意思了。 |
新增衍生變數
mutate() 函數新增衍生變數,舉例來說,我們要在elem資料框中新增衍生變數 BMI。
|
elem <- elem %>% mutate(BMI = 體重/(身高/100)^2) elem #將elem資料框傳送給mutate()函數,請它新增一個BMI變項, #此變項的計算為體重/(身高/100)^2,然後將BMI這個變項存回到原elem資料框, #那麼在RStudio的右上角點選elem檔,在最後一列會增加一個BMI變項。 elem$BMI #100個學生的BMI值。 #---------------------------------------------------------------------------------------------------------# elem <- elem %>% mutate(總成績 = (國文*0.6 + 數學*0.4)) elem$總成績 |
依照變數排序觀測值
利用 arrange() 函數將整個檔案或資料依據某個或某些變項排序,所有的變項內的資料會跟著所要的排序方式一起改變位置。
|
df_order <- elem %>% arrange(國文) df_order #可以看到國文分數從低排到高,湯姆漢克斯的國文是全班最低的。 df_order <- elem %>% arrange(-國文) df_order #國文前加個負號,就變成由高排到低,隋棠的國文最高。 |
聚合變數(總結或概括)
輸入所要聚合的變數以及聚合公式,summarise() 函數會依據公式運算出結果。例如總和、平均數或標準差都是聚合運算的結果。
|
df_sumarise <- elem %>% summarise(N
= n(), 身高平均 = mean(身高), 體重平均 = mean(體重), 國文平均 = mean(國文), 數學平均 = mean(數學)) df_sumarise #N = n()是計算樣本數。這是summarise()函數的內定寫法。 |
依照類別變數分組
group_by()函數可以用於依照類別變項分組,再搭配filter()、select()、mutate()或是summarise()等函數,便可以依照分組篩選觀察值、選擇變項、產生新的衍生變項或者是產生聚合的計算結果。
|
df_group_sumarise <- elem %>%
group_by(性別, 母親教育) %>% summarise(N = n(), 身高平均
= mean(身高),
體重平均 = mean(體重),
國文平均 = mean(國文),
數學平均 = mean(數學)) df_group_sumarise #---------------------------------------------------------------# df_group_mutate <- elem %>%
group_by(母親教育) %>% mutate(國文平均 = mean(國文), 數學平均 = mean(數學)) df_group_mutate #可以看到其依據母親教育程度,大學、研究所、高中、國中以及國小分組, #各組計算平均數,產生兩個新變項國文平均與數學平均, #各組內個人的分數都是組平均。 #這個函數是將來做到較高級的統計multilevel(多層次)的統計時,很好用的一個函數。 |
##-----------------------------------------------------------------------------------------------------------------------------##
Lahman package is a database which contains pitching, hitting, and
fielding statistics for Major League Baseball from 1871 through 2019. It
includes data from the two current leagues (American and National), the four
other "major" leagues (American Association, Union Association,
Players League, and Federal League),and the National Association of 1871-1875.
|
install.packages("Lahman") library(Lahman) dim(Teams) |
Teams這個資料包含自1871年以來大聯盟每一季的比賽結果,在我們下載此資料的時間點,資料總共有2925列48欄的資料。王建明主要在紐約洋基隊的時間是2005到2009。這些年度洋基隊的戰績如何,我們可以使用filter()以及select()兩個函數,將資料呼叫出來。
|
NYN <- Teams %>% filter(teamID == "NYN"
& yearID %in% 2005:2009) %>% select(yearID, teamID, W, L) NYN |
想要叫出王建民的一些基本資料,可以寫這樣的語句。
|
subset(People,
nameLast=="Wang" & nameFirst=="Chien-Ming") |
這個網頁「R Code for Teaching
Statistics Using Baseball」可以教你使用Lahman資料來學統計:http://facweb1.redlands.edu/fac/jim_bentley/Downloads/R/TSUBUsingR.html
留言
張貼留言