2016年12月27日 星期二

R學習基礎筆記(二)Arrays-Matrices、List-DataFrame、Loading-Dataset

(註: 本篇筆記諸多內容直接紀錄課程原文,而本文也僅整理資訊之用途)
課程連結 : R翻轉課程連結

RBasic-05-Arrays-Matrices

這門課程是要介紹R 的線性代數運算系統。線性代數在許多現代的統計方法、Data Mining方法上都很重要。所以理解R 的線性代數系統,對於撰寫自己的演算法,以及了解Open Source的演算法,是非常重要的。

[矩陣介紹]
數學上來說,一個矩陣除了值之外,需要的就是維度的定義。而`matrix`這個函數,`data`的參數代表矩陣的值, `nrow`的部份代表這個矩陣有多少列,而`ncol`的部份代表這個矩陣有多少行。所以`matrix(1:18,6, 3)`會產生一個 6 列3 行(簡稱6 乘3 )的矩陣。

dim() : 可以存取矩陣維度的函數。可透過dim來更改矩陣維度。
在R 中,矩陣的資料順序是:`c(x[1,1], x[2,1], x[3,1],...)`。也就是說,如果我們下指令:`matrix(1:18, 3, 6)`, 則x[1,1]會是1, x[2,1]會是2, x[3,1]是3, x[1,2]是4, 以此類推。高維度的矩陣也是類似。我們也可以利用中括號`[]`搭配邏輯向量取出矩陣或陣列中的值。
R會根據邏輯向量在`[]`中的位置,選擇該維度,只挑出該邏輯向量為TRUE 的座標。

[如何修改矩陣和陣列的元素]
1.要修改矩陣的值,搭配`[]`和`<-`

[矩陣運算]
1.矩陣的向量式運算。它和向量的運算也非常類似,也是會自動比對位置,並且在相同運算的位置上做運算
2.而當維度不相同的時候,R會自動重複比較短的那邊。
3.所有的矩陣和陣列,就是一般的向量加上 dim 這個屬性
4.除去dim屬性 : dim(x) <- NULL ,矩陣即變成向量
5.R在陣列和向量的向量式運算,也可以回到兩個向量的運算。差別只是在它們多了維度的屬性,所以當維度差異太大的時候,R會認為向量式運算無效。所以一般來說,我們只會拿單值或向量去和陣列做運算,或是維度相同的矩陣或陣列做運算。
6.在R 中,使用`cbind`和`rbind`則可以合併兩個矩陣。

[線性代數相關]
1.在R 中兩個矩陣要作矩陣乘法,就是使用`%*%`這個運算符號。
2.當兩個向量使用`%*%`做運算,會得到他們的內積。
3.轉置矩陣 : t()
4.用`diag`快速建構對角化的矩陣
5.如果已知` A %*% x = b `,給定`A` 和`b` 我們可以用`solve` 解出 x
6.反矩陣:solve(矩陣)
7.特徵值(eigenvalues)和特徵向量(eigenvectors) : eigen(矩陣)

*註:
R 上的線性代數運算的底層是透過BLAS等函式庫做運算的,所以效能遠勝過我們自己用C寫的線性代數運算。 另外R預設是使用比較被廣泛驗證過正確性的BLAS庫,而不是效能比較快,但是還比較年輕的BLAS函式庫,例如OpenBLAS。這是因為,R coreTeam認為正確性比較重要,所以目前是採用比較舊,但是也比較可靠的BLAS庫。

*HW:

求最小平方法之估計beta : solve(t(X)%*%X)%*%t(X)%*%y

RBasic-06-List-DataFrame

LIST

list的本質,就是一個「R物件的向量」,強調「向量」的概念,因為list 是有順序性的。
1.取list的方法
1.1 使用[[]]
1.2 list$,使用`$`來透過名字取出list的值

在windows上,如果名字是中文時,使用`$`的語法可能會出錯。一個比較保險的方式是:x$`中文名稱` 。這裡的 ` 符號的按鍵,在美式鍵盤中位於1的左方,這個符號唸作:Grave accent,是R 在console中的跳脫字元。以特殊符號 為名稱的變數,可以透過兩邊包覆Grave accent來在console中存取。

DataFrame

傳統的matrix和array由於有同質性的限制(所有的元素都要同樣的型態),所以在資料分析上並不方便。因為我們分析的資料,通常都不會全部都用相同的型態。在結構化的資料中,通常資料是以表格的形式,而各欄位會有自己的型態,例如是:數值型態、類別型態等等。

1.data.frame是一種list。因為表格的各欄是型態不一的向量,所以我們需要用list來裝不同型態的向量。
2.因為表格的資料是結構化的,所以data.frame的值不能存放太奇怪的物件。具體來說,data.frame的各個元素必須是以下幾種類型之一:數值(numeric)、字串(character)、布林(logical)、類別(factor)、數值矩陣(numeric matrix)、 list或data.frame
3.data.frame代表的是二維表格,所以每一個值的長度都要一致(矩陣或data.frame的話,則是列(row)的個數)。
4.在data.frame上,通常會先對欄位做選擇,取得欄位中的向量以後,才能使用中括號。
5.其實`[]`中括號這個函數,有一個參數叫做:`drop`,而且預設為`TRUE`。當我們使用`[]`取得結果的時候,如果有一個方向可以縮減維度(例如只有一個欄位的表格),R就會自動把表格的結構破壞,回傳一個向量。

*HW:
1.可以利用`model.matrix`來建立一個矩陣,類別變數若僅有兩種變化,可自動用1,0表示。
2.跑迴歸分析,可以簡單用`lm`這個函數
3.summary(g)則會顯示各個參數的t 檢定,以及整個模型的R-squared

RBasic-07-Loading-Dataset

[內建資料]
R 內建有許多知名的資料集。這些內建的資料集,目前都在`datasets`這個套件之中。
1.呼叫內建資料: data( 資料名, package = "datasets")
2.查詢內建資料詳細內容 :help(資料名)

[外部資料]
讀取中文資料的幾種方式,
此處僅介紹csv。

1.csv 檔的格式是以行(Line)為單位。每一行(Line)就是一筆紀錄(Record)。而每一筆紀錄中,是以一個分隔符號來讓使用者或程式分辨欄位。常見的分隔符號有: tab (\t)或逗號(,) 。

2.載入中文資料常見的編碼問題,參考以下連結
影片教學 :  什麼是編碼?

3.測試檔案編碼
3.1 檢查檔案有沒有BOM:
BOM是一種利用檔案最前面的2 個或 3 個位元組來標示檔案編碼的方式,在windows底下建立的中文檔案, 有很高的機會會帶BOM 。
readBin(lvr_land.path, what= "raw", n = 3)
 R 中的`readBin` 是一個很可以直接讀取檔案中的位元組的指令 ,所以可以正確的處理BOM。第一個參數是檔案的路徑。第二個名稱為 what的參數,是告訴R要如何處理讀入的資料。`what = "raw"`代表讀入的資料用位元處理,而不是文字。第三個名稱為n 的參數,代表要輸 入的長度。這裡選`n =3` 是因為通常BOM 最多就是3 個位元組。
接著查詢 常用的BOM,觀看是否出現常用編碼。

3.2使用`file`搭配`readLines`
如果讀出來的中文可以正常顯示,通常我們就猜中編碼了。如果讀出亂碼,或是讀取發生錯誤,那可能就猜錯了,就換個編碼猜猜看。
e.g. readLines(file(lvr_land.path, encoding = "BIG5"), n = 1)
n = 讀取行數

3.3使用file()搭配read.table()
read.table(file(目標位址, encoding = "BIG5"), sep = ",", header =TRUE)

#註:`file`函數會建立一個代表檔案的物件,在R 之中叫做`connection`。 R會不定時的關閉不使用的connection,並且在console 顯示警告訊息。
所以之後同學會不定時的看到:`closing unused connection`。

4. 使用readBin +  stringi 讀取外部資料
4.1
R 是型態為raw 的向量來處理位元的物件。只要能知道檔案的大小, readBin就可以把所有的檔案資料以raw 的形式輸入到R 中。
可以使用`file.info`來查詢檔案的大小 。
lvr_land.info =  file.info(檔案路徑)
lvr_land.bin = readBin(lvr_land.path ,what = "raw", n= lvr_land.info$size)
lvr_land.info$size = 該檔案大小

4.2
透過stringi套件的`stri_encode`,我們可以把一個位元組的向量(在 R中,這類向量的型態是raw )從一個編碼轉換為另一個編碼。
lvr_land.txt <- stri_encode(lvr_land.bin, "BIG-5", "UTF-8")

5.read.table  讀取CSV 格式檔案最泛用的指令
read.table( 路徑, fileEncoding = "BIG-5")
 fileEncoding 這個參數雖然可以解碼,但只能用在file參數為字串的case。
註1:在中文版windows 上預設會使用BIG5編碼,
註2:header = TRUE`代表檔案的第一行是欄位名稱,而不是資料。`header=FALSE`代表檔案的第一行就是資料。
seq = 分隔符號

5.1 我們可以用`l10n_info()`來查詢作業系統對於各種Encoding的支援狀況

根據經驗,如果`l10n_info()`的輸出中,MBCS為TRUE且UTF-8 為FALSE,則要使用:`textConnection(lvr_land.txt)`來從`lvr_land.txt`建立一個connection。除此之外,則使用`textConnection(lvr_land.txt, encoding = "UTF-8")`

6如果要使用R 讀取XML 的資料,可以使用套件XML 。如果要讀取JSON, 可以使用rjsonlite。只要資料格式是公開格式,我們很容易找到R 的套件來 讀取該資料格式。這就是R 是Open Source 的威力!

沒有留言:

張貼留言