--- disqus: ncyubrdecoinfo --- # 檔案的輸入 把外部資料輸入進 R 的時候,可使用 csv (逗號分隔檔案)或是 txt 資料表的格式。如果你習慣使用 Microsoft Excel 的話,也可以安裝[```readxl```](https://cran.r-project.org/web/packages/readxl/index.html) 這個套件來讀取 Excel 的檔案格式。 ## 讀取檔案 __讀取 Microsoft Excel 檔案__ 讀取 Excel 時,可使用 [```readxl```](https://cran.r-project.org/web/packages/readxl/index.html) 套件中的 ```read_excel()``` 來讀取,讀取的時候需要設定活頁簿(sheet)的名稱,若不知道名稱可以用 ```excel_sheets()``` 來取得名稱 ```{r} # 載入 readxl 檔案 library(readxl) # 使用 excel_sheets 讀取 excel 中的 sheet 名稱 sheetNames <- excel_sheets('some_excel_file.xlsx') # 假設只讀取第一個 sheet excelFile <- read_excel('some_excel_file.xlsx', sheet = sheetNames[1]) ``` __讀取 csv 檔案__ 假設我們有個資料表需要輸入進 R 分析,這個資料表長得像這樣: [資料下載](https://gist.github.com/mutolisp/83cc1fb6784c07e90542655c7e9f8da0) | id | plot | species | cover | | --: | ------ | --------- | ------: | | 1 | A01 | A | 5 | | 2 | A01 | B | 10 | | 3 | A02 | A | 1 | | 4 | A02 | C | 2 | | 5 | A02 | D | 3 | | 6 | A02 | E | 15 | | 7 | A03 | F | 25 | | 8 | A04 | F | 10 | | 9 | A04 | G | 5 | | 10 | A05 | A | 1 | | 11 | A05 | E | 1 | | 12 | A05 | F | 1 | | 13 | A06 | A | 1 | | 14 | A07 | A | 1 | | 15 | A07 | B | 1 | | 16 | A07 | C | 5 | | 17 | A08 | C | 10 | | 18 | A08 | D | 1 | | 19 | A08 | G | 2 | | 20 | A08 | H | 1 | 原始資料的樣貌(csv 檔案請參見 ```examples/ch1_r_project/data/datainput_example.csv```): ``` id,plot,species,cover 1,A01,A,5 2,A01,B,10 3,A02,A,1 4,A02,C,2 5,A02,D,3 6,A02,E,15 7,A03,F,25 8,A04,F,10 9,A04,G,5 10,A05,A,1 11,A05,E,1 12,A05,F,1 13,A06,A,1 14,A07,A,1 15,A07,B,1 16,A07,C,5 17,A08,C,10 18,A08,D,1 19,A08,G,2 20,A08,H,1 ``` 總共有 20 筆資料,四個欄位,第一列(row)是欄位的名稱。 在把資料輸入進 R 時,記得要先使用 Excel 或是 LibreOffice 看一下,因為有些資料可能沒有清理乾淨(例如分隔符號不統一、空白行、空白欄位等)。讀取資料時,也有可能碰到編碼的問題,例如 Windows 都用 Big5 編碼,碰到 Unicode (萬國碼,通常是 UTF-8)的資料時會出現錯誤亂碼等。這些問題我們先略過不提,在「資料清理」的部份會再詳細解說。 讀取資料使用 ```read.table()``` 或是 ```read.csv()```: ```{r} # 在讀資料之前,請先確定資料的位置 # 是絕對路徑或是相對路徑,例如在 Windows 中 # "C:\Users\User\Desktop\data\example.csv" 是絕對路徑 # "data\example.csv" 是相對路徑 > rawdata <- read.csv('data/datainput_example.csv') ``` 常用的參數有 ```header``` (欄位名稱的有無)、```sep```(分隔符號)、```na.strings``` (沒有資料的字串,例如 -9999)、```skip``` (省略的行數)等。例如預設讀入 csv 時,會把第一列當成欄位名稱,若你的資料中沒有欄位名稱,就可以使用```header=FALSE``` 來關掉讀取第一列當成欄位名稱。 分隔符號則是當你在讀取以 Tab、pipeline (|) 所需要輸入的符號,例如以 Tab 分隔,參數則為 ```sep = "\t"``` (```\t``` 代表 Tab 鍵)。另外還有個常用的是編碼(encodings),如果編碼是 unicode,參數為```encoding = "UTF-8"```。 ### 大檔案的讀取 不管你是使用 ```read.table()``` 或是 ```read.csv()``` 等輸入指令,碰到大檔案的時候,我會建議使用 ```data.table``` 套件底下的```fread()``` 來讀取資料。舉例來說,有個 csv 檔案約 20 MB,如果使用 ```read.csv()``` 來讀取大概要 3.4 秒: ```{r} # proc.time() 來取得計算的時間 > ptm <- proc.time() > a_csvread <- read.csv('data/testdata.csv') > proc.time() - ptm user system elapsed 3.438 0.086 3.695 ``` 但如果使用 ```fread()```,則只需要 0.132 秒。 ```R > ptm <- proc.time() > a_fread <- fread('data/testdata.csv') > proc.time() - ptm user system elapsed 0.132 0.015 0.452 ``` 因此當你如果有讀取大檔案的需求,請使用 ```fread()``` 來讀取檔案。 ## 檔案的輸出 和 ```read.csv``` 相同,有 read 就有 write,例如: ```R > write.csv(x, 'file/path/to/output/file.csv', row.names = FALSE) ``` ```write.csv()``` 預設會輸出列數,若你沒有這個需求的話, 可以把它關閉(```row.names=FALSE```)。 另外 data.table 中,也可以使用 ```data.table::fwrite()``` 來輸出檔案。 ## 工作資料的儲存 在 R 裡頭可以把目前工作階段中儲存之變數、載入的資料用 ```save.image('儲存的路徑/.rdata')``` 儲存成 R 映像檔,以方便下次使用。在使用 RStudio 退出時,通常也會問您是否要儲存工作階段的映像檔案至家目錄下,如下圖 ![](https://i.imgur.com/mZvFXLl.png) 若要手動儲存與載入的話,可以分別使用 ```save.image()``` 和 ```load()``` 來載入所儲存的 R 映像檔 ```{r}= # 儲存目前工作階段映像檔 save.image('到/儲存路徑/檔名.Rdata') # 載入映象檔 load('到/儲存路徑/檔名.Rdata') ``` :::info ### 關於路徑 路徑在 Windows 作業系統通常是 ``` C:\\Users/yourusername/file.Rdata ``` 或是相對路徑 ``` dir/file.Rdata ``` 如果在 Unix 或是 MacOS 請使用 ``` /Users/yourusername/file.Rdata ``` ::: ## 練習 Script 1. 基本的輸入資料練習 [<small>R Script 下載</small>](https://gist.github.com/mutolisp/252b751ce7235461274ca5f339043ad4) ```{r}= # 資料的輸出入 spcover <- read.csv('ecoinformatics_ex1026.csv', sep = ',', header = TRUE) # read.table spcover$species spcover$cover summary(spcover) library(data.table) spcover <- fread('C:\\Desktop\\ecoinformatics_ex1026.csv') # 使用 file.choose() 用檔案總管開啟 spcover <- fread(file.choose()) # 使用 fread 開啟大檔案速度會比 read.csv 快 ptm <- proc.time() test1 <- read.csv('~/Downloads/cwb2006-2015/raw/200601_auto_hr.txt', skip=73) proc.time() - ptm ptm <- proc.time() test1 <- fread('~/Downloads/cwb2006-2015/raw/200601_auto_hr.txt', skip=73) proc.time() - ptm ``` 2. 處理有中文的外部資料輸入 [<small>R Script 下載</small>](https://git.io/vFZQB) ```R # 練習從政府開放資料網下載資料 # https://data.gov.tw/dataset/6091 # 全臺灣大專院校名錄 # 預設在 data.gov.tw 上面的編碼是 UTF-8 # 記得把路徑改成你的檔案路徑,例如 C:\\Users\\username\\u1_new.csv # skip = 2 uniList <- read.csv('~/Downloads/u1_new.csv', skip = 2) # 另外我們也可以使用 data.table 的 fread 來讀取 library(data.table) uniList.df <- data.table::fread('~/Downloads/u1_new.csv', skip = 2, encoding = 'UTF-8', header = T) # 設定好正確編碼後,若讀取仍出現亂碼,請確認一下你的 # 系統語系(locale)是否正確 # 輸入 Sys.getlocale() ,如果不是 Chinese (Traditional)_Taiwan.950 # 者,請輸入下列指令設定 RStudio/R 的語系 # Sys.setlocale("LC_ALL","Chinese (Traditional)_Taiwan.950") ```