這篇文章講資料的基本處理。主要用到的就是
tidyverse
套件系統。它提供了資料科學的一些實用的函式。
我們首先要安裝tidyverse
套件系統
1 | install.packages("tidyverse") |
如果是第一次安裝套件,會讓你選擇CRAN repository的mirror,就近選擇一個就好。我是有選擇台大的鏡像站。另外,如果你想要更換鏡像站的話,在PyCharm下的步驟如下:
- 打開側邊欄R Tools,切換到Packages。
- 點按上面的“+”。
- 點按Manage Repositories。
- 在彈出的視窗中點按@CRAN@,然後點按上面的筆形按鈕。
- 在彈出的視窗中選擇Repository
在R Studio中的步驟請自行Google。
資料輸入
資料輸入套件 readr
readr
是tidyverse
套件系統中的一個套件,專門用於處理資料的輸入。其中的函式有read_csv()
用於輸入.csv資料檔,read_excel()
輸入excel資料檔,read_delim()
輸入不同分隔符號的資料檔。
其中read_delim()
函式的定義如下:
1 | read_delim( |
解釋一下引數:
- file:路徑與檔名
- delim:分隔符號
- quote:視同分隔符號(資料的文字變數值常放在雙引號中)
- escape_backslash:預設 FALSE,是否有逃脫符號
- escape_double:預設TRUE,是否用引號符號作為逃脫符號
- col_names:設定變數名(T 或 F)
- col_types:設定變數的類型
- na:設定 NA 符號
- comment:設定注釋符號,在注釋符號之後的文字不會被讀入
- trim_ws:去除變數值得空白
- skip:要跳過幾行(row)才開始讀入資料
- n_max:最大輸入行數
1 | library(tidyverse) |
整潔資料
所謂整潔資料(tidy data),可以認為是一個使用R進行處理的資料標準。該標準的基本要求如下:
- 每個變數各自形成一欄 (縱行, column)
- 每個列(橫列, row)各自為一個觀測時間的測量
- 一個檔案只用一張資料表(sheet)
- 一個欄位(縱行, Column)只有一個變數,同時有清楚的變數名
- 若完整資料包含不同資料表,則不同資料表要有索引 (inxex)或指標變數(id)可進行關聯與串聯
Tibble與Data Frame
透過readr
套件讀入的資料會被儲存成tibble物件。它相較於data.frame幾乎無差別,只是多了一些方便tidyverse
處理的屬性。
使用as.data.frame()
函式可以將tibble物件轉成data.frame。使用as_tibble()
函式也可以將data.frame轉換成tibble。
資料流動管道運算指令
運算指令為%>%
,稱為pipe,由tidyverse
套件系統中的magrittr
套件提供。
運算指令的左側通常是資料物件,包括資料框架、矩陣、向量等。右側則通常是函式。在流動過程中,左側的資料物件自動成為右側函式的第一個引數。
1 | library(magrittr) |
資料檢視函式 glimpse()
在讀入資料之後,我們必須對資料進行檢視,從而確定資料是否有被正確讀入。在tidyverse
套件系統的tibble
套件中提供一個檢視資料的函式glimpse()
,該函式類似於R base中的str()
。
執行效果如下:
1 | glimpse(dd) |
資料處理
資料處理的套件主要是tidyverse
套件系統中的dplyr
套件。用於將讀入的資料進行處理和統計操作。
選擇個體函式 filter()
從這個函式的名字也可以知道,這個函式和JS、Java等程式語言中的filter類似,都是起到一個過濾器的作用。在Excel中,也有類似的方法實現條件的過濾。
例如,我們想要選擇上面survVATrial.csv檔案內容中,threat為placebo,cellcode為large的內容:
1 | dd.a <- dd %>% filter(threat == 'placebo', cellcode == 'large') |
依據變數值排序函式 arrange()
預設情況下從小到大排序,如果要反排,可以使用desc()
函式。
1 | ## 按照age變數從小到大排序 |
選擇變數或欄位子集函式 select()
透過選擇欄位,可以建立欄位子集,將需要的變數儲存起來進行分析,這樣可以大大加速分析執行速度。
1 | ## 選擇餓dd中threat, cellcode, censor三個變數 |
變數轉換函式 mutate()
使用mutate()
函式,可以將變數進行一定形式的變換,形成一欄新的變數。
1 | dd.a <- dd %>% mutate( |
三因素運算函式 if_else()
這個函式類似於C家族程式語言中的三因素運算元?:
,其定義如下:
1 | if_else(condition, true, false, missing = NULL) |
解釋:如果condition
的值為TRUE,回傳true
的值,否則回傳false
的值。missing = NULL表示遺失值應當以什麼字元替代。
1 | x <- -10:10 |
變數重新命名函式 rename()
可以將變數重新命名:
1 | ## 格式:new_name = old_name |
移除遺失資料 drop_na()
使用tidyr
套件中的函式drop_na()
可將缺失值個體移除。請注意,缺失值移除將完全移除一個個體。只要該列中任意一個變數為NA,則將該列完全移除。
1 | ## 移除所有含有缺失值的個體 |
隨機抽樣函式 sample_n()和sample_frac()
這兩個函式可以對資料進行隨機抽樣。引數如下:
- size = k:設定所要抽出之樣本數或分率。
- weight:抽取之相對應權重,若無設定,則權重相等。
- replace = FALSE:設定是否可以重複抽取。
1 | dd %>% sample_n(size = 5, replace = FALSE) |
明顯不同個體選擇函式 distinct()和n_distinct()
舉例來說,假設你有一個資料框包含了某個學校的學生資訊,裡面有學生的姓名、性別和年級等欄位。如果有幾個學生重名,那麼使用 distinct() 函式就能快速地找出資料框中唯一不重複的學生資料列。
使用橫列指標選出個體函式 slice()
slice()
為一系列函式,可以利用橫列指標(row index)選出個體(row)。
- slice()
- slice_head():選出資料最前端的個體
- slice_last():選出資料最末端的個體
- slice_min():選出資料變數值最小的個體
- slice_max():選出資料變數值最大的個體
- slice_sample():隨機選出個體
1 | ## 選出第一列 |
計算常見統計量函式 summarise()
smmarise()
函式可以計算常見的統計量,比如個數、平均值、變異數等等,並將計算結果單獨作為一個變數插入原始資料中。
1 | dd %>% |
資料分組操作函式 group_by()
資料分析常常需要類別變數分組,個別操作資料或進行計算統計量。函式group_by()
引數可放入類別變數,然後分組進行相同資料分析。
1 | dd %>% |
多變數計算統計量函式 summarise_all()
summarise()
函式只能分別對當一變數進行計算,若要同時對許多變數進行相同操作,可使用以下函式:
- summarise_all():對每一個變數進行相同操作
- summarise_each():對每一個變數進行相同操作, 需加變數名
- summarise_at():對選出的變數進行相同操作 需加變數名
- summarise_if():對符合特定條件的變數進行相同操作
1 | ## summarise_all() |
資料聯集與交集函式
- intersect():交集
- union():并集
- setdiff():差集
1 | tibble1 <- tibble( |
資料合併函式
資料經常儲存再不同檔案,例如門診檔,住院檔,實驗室檔,同一位個體常須使用個體辨識碼 (id)或姓名(names)進行合併或清理。用來連結不同資料的個體辨識碼或變數稱為“關鍵碼”或“所引鍵”(key)。
在tidyverse
套件系統中,有一些函式可以實現這樣的合併作業。
- inner_join(x, y):包函x與y都配對存在的y與y個體與變數
- left_join(x, y):包函所有x個體與變數且在y有配對存在的y個體與變數
- right_join(x, y):包函所有y個體與變數且在x有配對存在的x個體與變數
- full_join(x, y):包函所有x與y的個體與變數資料
- semi_join(x, y):包函x在y有配對存在的x個體與變數
- anti_join(x, y):包函x在y無配對存在的x個體與變數
1 | set.seed(1) |