# 暑期生R教學
# R & R studio 基礎操作
## 下載與安裝
[詳見簡報](https://docs.google.com/presentation/d/1IXcCiGgHn9esspFfAeZSAMDw0PdKk4D8/edit?usp=sharing&ouid=103220148807199655577&rtpof=true&sd=true)
## 套件(package)
套件為R語言、python、QGIS等做為開放原始碼的軟體一大特色,能直接安裝其他開發者做出來的工具,不僅可以縮短使用者重複撰寫程式碼的時間同時也減少了檔案的容量。
安裝套件:
`install.packages("套件名稱")`
或是利用R studio的介面下載安裝:

讀取套件:
`library("套件名稱")`
建議無論是使用任何一種套件或函數,都需要先做查詢,確認其正確的功能以及各項參數的設定方式為何。
## 函式與變數
函式 (function) 為程式碼(code)執行功能的元素,函式簡單的結構如下:
`FUN(變數1, 變數2, ......., 指令1= 'A', 指令2= 'B', ......)`
### 自訂函式
```r=
#自訂函式
##函式結構
myFunction <- function (參數1, 參數2 ......){
FUN_1('statements')
FUN_2('statements')
......
#若是要函式計算完後回傳一些東西,也可以在最後一行加上return('你要回傳的物件')
return('objects')
}
#範例 Hello World
helloWorld <- function(){
print('Hello World!')
}
helloWorld()
```
### 設定變數
在自訂函式中設定變數
```r=
#自訂函式
##變數:username
helloWorld <- function(username){
#%s
sprintf('Hello! %s', username)
}
helloWorld('小熊維尼')
```
## 除錯(debug)
* warning message:
函式可順利運作,但最後出來的結果可能會失真。
* error message:
通常無法跑出資料,函式無法發揮原來的功能。
**保持堅定的耐心!!多查詢、參考網路上其他人的經驗**
### 查詢R套件與函式功能或程式設計疑問之相關路徑:
1. 反白函式後按住Ctrl以滑鼠左鍵點選函式即會跳出函式原始的結構及內容
範例read.csv()函式內容如圖:

2. 在R Studio的Help功能中做查詢
如圖:

3. 網站:
* stackoverflow: https://stackoverflow.com/
* R Documentation: https://www.rdocumentation.org/
* GitHub: https://github.com/
* 各式論壇..
4. Just google it !!
---
## 工作路徑
若要操作的資料皆存放在同一個資料夾中,可以預先將工作路徑設定在檔案存放的路徑上,以縮短後續程式碼的撰寫,路徑的分隔以"/"或"\\\\"分隔出儲存位置的不同層。
1. 取得目前工作路徑:`getwd()`
2. 設定工作路徑:`setwd()`
```r=
#範例:讀取桌面的資料
#設定路徑為桌面
setwd('C:/Users/使用者名稱/Desktop/')
#讀取檔案A~C
A <- read.csv('A.csv', header = T, sep = ',')
B <- read.csv('B.csv', header = T, sep = ',')
C <- read.csv('C.csv', header = T, sep = ',')
```
**請在桌面上建立一資料夾,並命名為practice。接著下載範例資料:demo_1, demo_2, demo_3,並將工作路徑設定為目前範例資料中所儲存的位置**
---
# 檔案的輸入與輸出 (表格資料)
要將外部的表格資料輸入進R,可以將資料儲存成csv檔或txt檔的格式後讀入R中。若是要直接輸入Microsoft Excel資料,則可以安裝readxl 套件來讀取 Excel 檔案。特別注意在讀取資料前一定要先確認檔案所在的位置 (右鍵點選目標檔案,選擇"內容",即可獲得檔案位置)。
## 讀取csv, txt檔案
csv檔案為資料以逗號(,)為分隔的表格資料,可以函式`read.csv()`或`read.table()`讀取,而txt檔案則可以在確認檔案的分隔方式後,以`read.table()`中的sep參數做分隔方式的設定後讀取。
```r=
#讀取csv檔案
A <- read.csv("檔案路徑/A.csv", header = T, sep = ",")
```
## 讀取excel檔
excel檔案含有許多工作表(sheet),需先讓R認識excel檔中有哪些sheet,接著讓R讀取目標的sheet。
```r=
#載入readxl
install.packages('readxl')
library('readxl')
#使用 excel_sheets 讀取 excel 中的 sheet 名稱
sheetNames <- excel_sheets('C:/Users/farewell/Desktop/A.xlsx')
#假設只讀取第一個 sheet
excelFile <- read_excel('C:/Users/farewell/Desktop/A.xlsx', sheet = sheetNames[1])
```
在把資料輸入進 R 前,也記得要先看檔案中的內容,原始檔案中有些資料可能沒有清理乾淨(例如分隔符號不統一、有的空白行、空白欄位等),這時候就需要先將原本的檔案做預先處理,整理乾淨。
另外,在讀取資料時,也有可能碰到資料內容中[字元編碼](https://zh.wikipedia.org/zh-tw/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81#Windows%E5%AD%97%E7%AC%A6%E9%9B%86)不同的問題,例如:常用是 Unicode (萬國碼,通用是[UTF-8](https://zh.wikipedia.org/zh-tw/UTF-8)),而繁體中文是使用 Big5 編碼方式呈現文字,若以不合的編碼系統開啟資料時,會出現文字呈現亂碼的問題,因此在儲存或是讀取時需要注意選擇符合的編碼類型,**也建議在撰寫程式碼時以英文為主,並儲存成常用的UTF-8,避免下次開啟時出現亂碼**
補充:
讀取大型資料檔案時,data.table套件對於處理大型資料上所花的時間較短,是一項實用的工具,可使用`fread()`讀取檔案,而這方面可以利用`proc.time()`來做時間的測試實驗。
```r=
ptm <- proc.time()
A <- fread('檔案路徑/A.csv')
proc.time() - ptm
```
## 檔案的輸出
在R中操作完畢後的資料想輸出成外部檔案,可指定路徑後選擇儲存成cvs檔`write.csv()`或txt檔`write.table()`,或者也可以用data.table中的`data.table::fwrite()`來輸出。
若要儲存為圖檔,則可以使用`ggsave()`。
---
# 資料結構
在資料分析上了解你目標資料的結構是很重要的,避免目標的物件和要套用進的函式中內容不相符,導致函式無法順利運作,可以利用`class()`來獲得該物件為何種資料類型,`str()`則可獲得物件所含內容物的資料類型,也可以使用`as.欲修改之資料類型()`來進行不同資料類型間的轉換。
## 資料類型
* 一維:
向量(vector)
因子(factor)
數值(numeric)
文字(character)
邏輯判斷(logic)
日期(date)
* 二維:
矩陣(matrix)
資料框(data.frame)
* 多維:
列表(list),其結構如圖:

---
# 表格與資料整理
表格中橫的為列 (row),直的為欄 (column),可以透過指定列或欄來獲取表格中的部分資料。
* 列資料

* 欄資料

## 自訂表格
我們可以利用`data.frame()`來創建一個客製化的表格
```r=
##建立表格:物種A~D分別在plot 1, plot 2中記錄到的個體數
#column名稱:Plot_1, Plot_2
dataset <- data.frame(Plot_1 = c(15,20,9,17), Plot_2 = c(8,8,3,5))
#建立row名稱:A~D
rownames(dataset) <- c("A","B","C","D")
```
完成表格 :dataset
| | Plot_1 | Plot_2 |
| ------ | ------ | ------ |
| A | 15 | 8 |
| B | 20 | 8 |
| C | 9 | 3 |
| D | 17 | 5 |
## 資料篩選
可利用 `unique()`、`duplicated()` 來篩選處理重複的資料,如前面所說,我們能夠透過指定row和column來取得表格中我們想要的部分資料。
```r=
##抓取column 1 資料(Plot_1):
#輸入column序號
data_1 <- dataset[,1]
#或是以$接column名稱
data_1 <- dataset$Plot_1
##抓取row 1 資料(specie A):
#輸入row序號
data_A <- dataset[1,]
```
另外也可以利用一些邏輯判斷的方式來取得符合條件的資料。
```r=
##目標:取得dataset中plot 2紀錄為8個個體的物種在plot 1及plot 2的紀錄資料
#以dataset$Plot_2==8取得plot 2中第幾項資料的紀錄有8個物種
data_selected <- dataset[dataset$Plot_2==8,]
```
## 表格資料合併
在表格資料的整理中,常會需要將不同的表格以水平(合併column/相同的row,不同的column)或垂直(合併row/相同的column,不同的row)的方式整合在一起,水平合併可用`cbind()`,垂直合併可用`rbind()`。**特別需要注意確認合併時所對應到的row或是column名稱要是相同的!**
### 資料處理利器:dplyr套件
包含實用的函式有:
`filter()`:選取指定條件之觀察值
`summerize()`:摘要資料
`arrange()`:重新排列欄位資料
`group_by()`:比較群組之間的關係
## 練習1
1. 將範例資料**demo_1**依照不同觀察縣市,各自分割後,轉存成cvs檔至practice資料夾中。
---
# 數學運算
在R中的四則運算:加減乘除代表的運算符號分別為 +, -, *, /,平方則可以^或**計算。
下方為R所常用的數學運算子:
| 運算子 | 說明 |
| ------- | ------------- |
| + | 加 |
| - | 減 |
| * | 乘 |
| / | 除 |
| ^ 或 ** | 平方 |
| x %% y | x 除 y 的餘數 |
| x %/% y | x 除 y 的商數 |
## 常用的運算函式
對數:
`log10()` (以10為底取log);`log()` (取natural log)
指數:
`exp()`
加總:
`sum()`
開根號:
`sqrt()`
## 邏輯判斷
R常見的邏輯判斷符號:
| 邏輯判斷 | 說明 |
| -------- | -------- |
| > | 大於 |
| < | 小於 |
| >= | 大於等於 |
| <= | 小於等於 |
| == | 相等 |
| != | 不相等 |
| a | b | a或b |
| a & b | a而且b |
邏輯判斷的結果為三種:真(TRUE/T)、偽(FALSE/F)及 NA (not available)
```r=
#TRUE
8 > 6
#FALSE
17 != 17
#TRUE
3 == 3
#TRUE
18 <= 18
```
**缺值(NA)的排除:設定na.rm = T**
## 敘述性統計
平均值:
`mean()`
中位數:
`median()`
百分位數:
`quantile(probs = 欲選取之百分位數值(ex:0.25))`
極值:
`max()` (抓最大值);`min()` (抓最小值)
標準差:
`sd()`
## 練習2-計算
1. 承練習1,請計算各縣市所記錄到的所有物種個數之加總、平均值、最大值、最小值。
2. 請利用自訂函式計算各縣市的[Shannon-Wiener 多樣性指數](https://zh.wikipedia.org/wiki/%E5%A4%9A%E6%A0%B7%E6%80%A7%E6%8C%87%E6%95%B0)
### 挑戰
請問什麼是費布納西數列(Fibonacci sequence; F)?請計算並列出第 1–20 的費布納西數(F1,F2,F3,…,F20)。
---
# 資料視覺化
資料視覺化可幫助我們快速的了解所收集到的資料情況,甚至能結合統計分析的結果呈現給讀者看。工具上常用ggplot2套件,ggplot2內含許多函式,概念上可以在一張圖上一層一層的疊加元素上去,並針對圖上的各項元素進行如:字形類型、字體大小、顏色等做深入的設定。
## 常用資料視覺化圖形
### 折線圖
```r=
library('ggplot2')
#製作簡單的資料(月平均氣溫圖)
Plot_A <- data.frame(
month = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12),
temp = c(15.4, 15.7, 17.7, 21.4, 24.7, 27.3, 29.0, 28.7, 26.9, 23.6, 21.0, 17.3)
)
#檢查表格
print(Plot_A)
#繪製折線圖
##輸入表格資料
ggplot(Plot_A, aes(x = month, y = temp)) +
##加上折線
geom_line()+
##加上點
geom_point()+
##設定X軸範圍:1~12, 並只標示1~12的數值
scale_x_continuous(breaks = 1:12*1, limits = c(1,12))
```
成果如圖:

### 盒形圖
用以表示一組資料中四個百分位數區間的位置 (0-25%,25-50% 50-75%, 75-100%)
```r=
#製作簡單的資料(2樣點之月平均氣溫圖)
Plot_Temp <- data.frame(
##rep()功能為重複指定元素之函式
plot = c(rep('plotA', 12),rep('plotB', 12)),
temp = c(10.3, 11.2, 13.2, 16.6, 19.6, 22.2, 23.4, 23.0, 21.1, 17.9, 15.4, 11.8,
15.4, 15.7, 17.7, 21.4, 24.7, 27.3, 29.0, 28.7, 26.9, 23.6, 21.0, 17.3)
)
#檢查表格
print(Plot_Temp)
#繪製盒形圖
##輸入表格資料
ggplot(Plot_Temp, aes(x = plot, y = temp)) +
##繪製盒形圖
geom_boxplot()
```
成果如圖:

### *XY*散佈圖
***x***為自變數,***y***為應變數
```r=
#製作簡單的資料(獵物、捕食者族群數)
prey_pred <- data.frame(
rabbit = c(61, 72, 78, 76, 65, 54, 39, 43),
wolf = c(26, 33, 42, 49, 37, 30, 24, 19)
)
#檢查表格
print(prey_pred)
#繪製xy散佈圖
##輸入表格資料
ggplot(data = prey_pred, aes(x=rabbit, y=wolf))+
#加上資料點
geom_point()+
#以線性迴歸模型 (linear regression) 繪製迴歸直線
geom_smooth(method=lm, se=TRUE)
```
成果如圖:

# 基礎統計分析
依照統計上[資料分布](https://zh.wikipedia.org/wiki/%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83)是否呈現[常態分布](https://zh.wikipedia.org/wiki/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83)可大致分為兩種統計方式:
1. [母數統計](https://zh.wikipedia.org/wiki/%E6%AF%8D%E6%95%B8)
2. [無母數統計](https://zh.wikipedia.org/wiki/%E6%AF%8D%E6%95%B8)
若要進行資料是否為常態性的檢定,可使用 Shapiro-Wilk 檢定 `shapiro.test()` 。
統計結果是否具顯著性,類似為是否大多數的資料有相同的趨勢。在應用上需視使用的統計方法所設定的標準做判斷,而以下這三個統計方式通常以p值是否小於0.05,即表示具有統計上的顯著性,p值小於0.01則相較下又具有更強的顯著性。
## Two-sample test
檢測兩份資料之間是否有顯著性差異。
Student's t-test (母數):
`t.test()`
Wilcoxon Signed-rank Test (無母數):
`wilcox.test()`
```r=
library('dplyr')
#製作簡單的資料(2樣點之月平均氣溫圖)
Plot_Temp <- data.frame(
##rep()功能為重複指定元素之函式
plot = c(rep('plotA', 12),rep('plotB', 12)),
temp = c(10.3, 11.2, 13.2, 16.6, 19.6, 22.2, 23.4, 23.0, 21.1, 17.9, 15.4, 11.8,
15.4, 15.7, 17.7, 21.4, 24.7, 27.3, 29.0, 28.7, 26.9, 23.6, 21.0, 17.3)
)
#Student's t-test
t.test(filter(Plot_Temp, plot == 'plotA')$temp,
filter(Plot_Temp, plot == 'plotB')$temp)
#Wilcoxon Signed-rank Test
wilcox.test(filter(Plot_Temp, plot == 'plotA')$temp,
filter(Plot_Temp, plot == 'plotB')$temp)
```
結果:
Student’s t-test:

Wilcoxon Signed-rank Test:

## 相關性分析
用以表示兩份資料間的相關性 (正相關/負相關/無相關性),使用上會以p值確認是否顯著具有相關性,再以R平方值確認相關性的可信度 (R平方值為0~1的數值,數值越大表示相關性的可信度越大)。
Pearson correlation coefficient (母數):
`cor.test()`
Spearman's rank correlation coefficient (無母數):
`cor.test(method = 'spearman')`
```r=
#製作簡單的資料(獵物、捕食者族群數)
prey_pred <- data.frame(
rabbit = c(61, 72, 78, 76, 65, 54, 39, 43),
wolf = c(26, 33, 42, 49, 37, 30, 24, 19)
)
#Pearson correlation coefficient
cor.test(prey_pred$rabbit, prey_pred$wolf)
#Spearman’s rank correlation coefficient
cor.test(prey_pred$rabbit, prey_pred$wolf, method = 'spearman')
```
結果:
Pearson correlation coefficient:

Spearman’s rank correlation coefficient:

## 線性迴歸模型 (linear regression model)
*y*值符合常態分布時,以自變數*x*預測應變數*y*的變動,線性迴歸公式:
*y* = **a***x*+**b**
(多元線性迴歸:y = **a1***x1*+**a2***x2*+...+**b**)
`lm(y~x, data='datasetA')`
```r=
#製作簡單的資料(獵物、捕食者族群數)
prey_pred <- data.frame(
rabbit = c(61, 72, 78, 76, 65, 54, 39, 43),
wolf = c(26, 33, 42, 49, 37, 30, 24, 19)
)
#線性迴歸分析獵物數量的變動和捕食者之間的變動關係
lm(wolf ~ rabbit, data = prey_pred)
```
結果:
`summary(lm(wolf ~ rabbit, data = prey_pred))`

補充:
||*y*值符合常態分布|*y*值不符合常態分布|
|---------------|------|----|
|**不須控制[隨機因子](https://en.wikipedia.org/wiki/Mixed_model)**|線性迴歸模型 (linear regression model, LM)|廣義線性模型 (general linear model, GLM)|
|**須控制隨機因子**|線性混合模型 (linear mixed model, LMM)|廣義線性混合模型 (general linear mixed model, GLMM)|
## 練習3-繪圖+統計
1. **請利用demo_1資料**
1-1. 繪製三個城市物種個體數盒形圖。
1-2. 檢測臺北v.s.新北、新北v.s.桃園、臺北v.s.桃園三種組合中,兩兩地點間的物種個體數是否有顯著差異。
2. **請利用demo_2, demo_3資料**
1-1. 繪製*xy*散佈圖(*x*為氣溫;*y*為各月份之shannon diversity指數)。
1-2. 利用線性迴歸分析臺北市各月份氣溫與shannon diversity間的關係。
---
# 如何編寫clean code
http://adv-r.had.co.nz/Style.html
---
# 參考資料來源
Ting-Chih Hung學習筆記:
https://bookdown.org/b08302310/R_learning_notes/
Rita Tang學習筆記:
https://hackmd.io/@ritatang242
嘉義大學林政道老師-生態資訊課程教材:https://hackmd.io/@mutolisp/H1O00yGjZ/https%3A%2F%2Fhackmd.io%2Fs%2FH1O00yGjZ?type=book
Statistical tools for high-throughput data analysis-ggplot2-Essentials:
http://www.sthda.com/english/wiki/ggplot2-essentials
e-Bird觀察資料:
https://ebird.org/home
###### tags: `R tutorial`