【tidyverse】part1:資料匯入

weixin_34208283發表於2018-03-03

1. 基本資料匯入與readr包應用

1.1 基本資料匯入函式

readr包中的基本匯入函式如下:

  • read_csv()匯入以逗號分隔符的csv檔案
  • read_csv2()匯入以分號分隔符的csv檔案
  • read_tsv()匯入以製表符分隔符的檔案
  • read_delim()匯入任何分隔符的檔案
  • read_table()匯入空格分隔符的檔案

以上函式(或是未提及的)一旦掌握其中一個,就可以很輕鬆的觸類旁通,本節以read_csv()函式為例

1.2 深入解析

匯入資料函式的第一個引數是最重要的一個,即資料檔案的路徑;只有確定了路徑檔案才能被正確的讀入

當然,除了讀取資料之外,還可以直接在函式裡建立資料,類似於tibble一樣

  • 第一行會自動識別為是表頭,之後才是資料
  • 並且還有skip=#na=comment=''col_names=等其他引數可以協助更好的讀入和建立資料表
  • n_max=n參數列示最大讀取記錄的數量,guess_max=n參數列示最大讀取列的數量

skip

表示跳過資料的前幾行,從跳過的行之後開始讀取

read_csv('the first line of metadata
         the second line of metatd
         x, y, z
         1, 2, 3', skip = 2)

comment

表示指定註釋符,即讀取跳過註釋符號所註釋的內容

read_csv("# A comment I want to skip 
           x,y,z 
          1,2,3", comment = "#")

na

表示缺失值的呈現方式,可以自己指定

read_csv("a,b,c\n1,2,.", na = ".")

col_names

表示是否將輸入內容指定為列名,引數為邏輯值

1.3 readr包的函式對比於R的基礎匯入函式

  • 速度比R基礎的匯入函式更快(大約10倍)
  • 可以直接生成tibble格式,不需要再額外轉換
  • 可重複展示

1.4 其他方式匯入資料

當然還有個別的匯出方式可供參考,可以分別使用以下包來進行獲取:

  • haven包:讀取spss、stata、sas格式的檔案
  • readxl包:讀取Excel文件(包括.xls和.xlsx格式)
  • DBI包:提供各種SQL資料庫的介面

小結

  • readr包中匯入資料的函式用法基本一致,掌握一個對其他就可以觸類旁通
  • 讀取資料時一定要時刻記住,第一個引數是檔案的路徑
  • 其他引數可以幫助更好的匯入資料,如設定最大讀取的數量
  • readr包的函式比R基礎匯入函式能匯入速度更快
  • 除了基本匯入函式還要有其他包可以提供其他格式的匯入方法

--

2. 資料型別轉換

2.1 型別轉換函式

使用parse_*()函式族能將字元向量轉換為特定型別的向量(如邏輯型、整型等),其功能大致類似於R基礎的as.*函式

  • 第一個引數是要轉換的字元
  • 第二個引數為要作為NA值處理的字元
parse_integer(c("1", "231", ".", "456"), na = ".")
  • 如果轉換失敗,可以使用problems函式來檢視轉換失敗的資訊

在這個函式族中,有8個尤為重要的函式:

  • parse_logical()parse_integer()
  • parse_double()parse_number()
  • parse_character()要注意encodings編碼格式
  • parse_factor()
  • parse_datetime()parse_date()parse_time()(最複雜的一組)

2.2 函式詳解

數值型:parse_number()

往往數值型在輸入時會有以下幾個問題需要注意的:

  1. 分隔符不同,有使用「.」或者「,」的情況;因此需要使用locale = locale(decimal_mark = '*')來指定輸入的分隔符;預設為「.」,另一個選項為「,」,只有這兩種選項可以使用
  2. 數值可能與其他符號相連,類似「%」或「¥」等;但好在parse函式族會自動解決這種情況,會忽略除了數字以外的其他字元
  3. 數值可能不會進行位數分隔,類似於「123,456,789」這種情況不會進行位數分隔;因此需要在第一種情況下,將decimal_mark替換位grouping_mark

字串型:parse_character()

在現實中,往往會因為編碼不同而無法正確識別文字,雖然可以通過引數來修改,但是修改的第一步是對字元進行判斷;readr包提供了guess_encoding()函式來幫助確認字元屬於哪種編碼格式

  • 但需要注意的是,在函式中使用charToRaw(character)轉化為16進位制的字元,guess_encoding()函式才能起作用,否則會報錯
    • 當然,其第一個引數也可以是檔案的路徑

之後便可以將在locale()引數中使用encoding=*來進行編碼的修改

因子型:parse_factor()

該函式可以也可以像factor()函式一樣指定水平

  • 但有一點需要注意的是,該函式並沒有label引數,即將水平與標籤合二為一。因此需要格外注意

日期型:parse_datetime(),parse_date(),parse_time()
像MySQL裡的一系列date函式一樣,可以分別獲取日期資料的年月日、時分秒等;
並且還可以使用R轉換為時間值的format型別(%b、%Y等)

  • 大寫的字母格式往往表示全稱,而小寫的字母則表示簡略縮寫
  • 第一個引數為時間,第二個引數為格式
parse_date("01/02/15", "%y/%m/%d")

2.3 檔案轉換

readr包可以通過檔案資料中的某些關鍵字,啟發式地自動判斷讀入的檔案的資料型別;
當然類似於猜測編碼格式一樣,readr的另一個函式可以幫助來判斷一個向量的資料型別:

  • 使用guess_parser()函式或parse_guess()函式

在使用read_*資料匯入函式族時,使用col_types=cols(column = col_type)引數來指定變數的型別,既能避免readr錯誤識別變數型別,還能加快讀取速度;這就類似於R基礎匯入資料中的colClass引數

  • 每一個col_*函式都對應著parse_*,能在讀取時將變數進行型別轉換
  • 如果已經讀取資料,發現變數型別錯誤,不再想重新讀入;則直接使用type_convert()函式中的col_type=來直接修改變數型別

小結

  • parse_*()函式族類似於R基礎函式中的as.type函式族,能對變數進行型別轉換;大致上不同型別的用法語句基本相似,在實際情況中使用幫助文件來檢視即可
  • 提高資料檔案讀取速度的方法是:設定最大讀取的數量並且為變數指定型別
  • 使用problems()函式可以檢視報錯的具體情況

--

3. 資料匯出

使用readr包的write_*函式族來進行資料的匯出,這一族的資料匯出的資料有以下兩點優點:

  1. 永遠使用UTF-8編碼
  2. 將日期值按「ISO-8601」編碼標準來儲存,使得在任何情況下都能被正確讀取
  • 該族函式的第一重要個引數為要匯出的資料框
  • 第二個重要的引數為路徑(如果沒有特別指定,一般都是R的當前預設工作路徑,使用getwd()函式直接獲取)
  • 通過幫助文件可以獲取更多引數資訊,如NA
  • 匯入和匯出的函式命名方式往往都差不多,掌握一個就可以觸類旁通

小結

  • 每個匯入函式都有對應的write_*()匯出函式
  • 要時刻注意匯出函式的第一和第二引數分別為要匯出的資料框和儲存路徑(預設為R工作路徑),其他引數檢視幫助文件
  • 匯出時如果沒有對資料進行預先處理,那麼匯入資料時仍會有出錯,因此要時刻注意列的型別轉換

相關文章