R 的 rio 套件是一個綜合型的檔案匯入與匯出工具套件,支援各種常見的檔案格式。

當我們要把資料從別的軟體匯入 R 中,或是要從 R 中匯出資料到別的軟體時,都會需要處理各式各樣檔案格式的轉換問題,傳統上不同的檔案格式會需要使用不同的匯入與匯出方式,而所需要安裝的套件也不同,當然使用方法也會有很大的差異,所以不是很方便。


rio 這個套件則是將各種常見的資料格式都整合起來,變成一個萬用型的資料匯入與匯出工具,它會自動判斷檔案的格式,選擇適合的方式來處理,讓操作介面統一,使用上更單純。

安裝 rio 套件

rio 這個套件是 R 官方收錄的套件之一,所以可以使用 install.packages 直接安裝:

install.packages("rio")

安裝好之後,載入 rio 套件:

library(rio)

將樣就可以開始使用了。

rio 所支援的檔案格式相當多,完整的檔案格式列表可以從 rio 官方的文件上查詢。

匯出資料

rio 所提供的 export 函數可以將 R 的 data frame 匯出成各種的檔案格式:

export(iris, "iris.csv") # CSV 檔
export(iris, "iris.rds") # RDS 檔
export(iris, "iris.dta") # Stata 檔

匯入資料

import 則可以自動匯入各種檔案格式:

iris.1 <- import("iris.csv") # CSV 檔
iris.2 <- import("iris.rds") # RDS 檔
iris.3 <- import("iris.dta") # Stata 檔

對於沒有副檔名的檔案,可以自行指定檔案的格式。例如匯入一個沒有副檔名的逗點分隔(csv)檔:

iris.4 <- import("iris_noext", format = "csv")

某些檔案格式可能會包含許多張資料表格,這時候可以使用 which 參數來指定要匯入哪一張表格,例如讀取 Excel 檔的第二張表格:

my_file.1 <- import("my_file.xlsx", which = 2)

內部參數

rio 實際上做的事情就是自動判斷檔案的格式,然後依照檔案格式,呼叫對應的檔案匯入或匯出工具,我們也可以將特定的參數傳給 rio 背後所呼叫的函數,調整檔案匯入或匯出時的選項,以下是一個 Fixed Width Format 檔案格式的範例。

首先產生一個 Fixed Width Format 檔案:

# 建立一個 fwf 暫存檔
fwf <- tempfile(fileext = ".fwf")

# 寫入檔案內容
cat(file = fwf, "123456", "987654", sep = "\n")

rio 在讀取 fwf 這種檔案時,內部其實是使用 read.fwf 這個函數來讀取的,我們可以在 import 的參數中直接指定 read.fwf 函數所需要的 widths 參數:

# 資料欄位寬度為 1, 2, 3
import(fwf, widths = c(1, 2, 3))
  V1 V2  V3
1  1 23 456
2  9 87 654
# 資料欄位寬度為 1, 2, 3,丟棄第 2 欄
import(fwf, widths = c(1, -2, 3))
  V1  V2
1  1 456
2  9 654

測試完成後,把剛剛建立的暫存檔刪除:

unlink(fwf)

檔案格式轉換

rioconvert 可以處理不同資料格式之間的轉換工作,事實上他就是結合 importexport 將資料匯入之後再以不同的格式匯出而已,使用方式如下:

# 輸出測試用的 Stata 檔
export(iris, "iris.dta")

# 將 Stata 檔轉為 SPSS 檔
convert("iris.dta", "iris.sav")

在呼叫 convert 時,我們可以透過 in_optsout_opts 參數指定 importexport 用的參數:

# 建立測試用的暫存檔
fwf <- tempfile(fileext = ".fwf")
csv <- tempfile(fileext = ".csv")

# 寫入檔案內容
cat(file = fwf, "123456", "987654", sep = "\n")

# 將 fwf 檔轉為 csv 檔
convert(fwf, csv, in_opts = list(widths = c(1, 2, 3)))

# 匯入轉好的 csv 檔
import(csv)

# 刪除測試用的暫存檔
unlink(fwf)
unlink(csv)