├── .gitignore ├── basic_operation ├── README.md ├── data_attribute.md └── common_operation.md ├── cover.jpg ├── control_flow ├── README.md ├── logic_decision.md ├── conditional_execution.md └── loop.md ├── cover_small.jpg ├── arrange_data ├── README.md ├── recode.md ├── reshape.md └── merge_and_subsetting.md ├── customize_function ├── README.md ├── initialize.md └── define_function.md ├── data_import_and_export ├── README.md ├── load_database.md ├── export_data.md └── import_data.md ├── image └── environment_settings │ ├── console.png │ ├── dash-1.png │ ├── dash-2.png │ ├── download-1.png │ ├── download-2.png │ ├── download-3.png │ ├── download-4.png │ ├── download-5.png │ ├── download-6.png │ ├── download-7.png │ ├── download-8.png │ └── download-9.png ├── variable_and_data ├── README.md ├── variable.md ├── list.md ├── factor.md ├── data_frame.md ├── array.md ├── matrix.md └── vector.md ├── environment_settings ├── README.md ├── open_R_console.md ├── install_RStudio.md ├── install_R.md ├── install_and_load_package.md ├── Change_R_version.md └── RStudio_introduction.md ├── README.md └── SUMMARY.md /.gitignore: -------------------------------------------------------------------------------- 1 | _book/ 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /basic_operation/README.md: -------------------------------------------------------------------------------- 1 | # Chapter 2 - 基本運算 2 | 3 | 1. 資料屬性 4 | 2. 常見運算 -------------------------------------------------------------------------------- /cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/cover.jpg -------------------------------------------------------------------------------- /control_flow/README.md: -------------------------------------------------------------------------------- 1 | # Chapter 5 - 流程控制 2 | 3 | 1. 邏輯判斷式 4 | 2. 條件執行 5 | 3. 迴圈結構 6 | -------------------------------------------------------------------------------- /cover_small.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/cover_small.jpg -------------------------------------------------------------------------------- /arrange_data/README.md: -------------------------------------------------------------------------------- 1 | # Chapter 6 - 資料整理 2 | 3 | 1. 重新編碼 4 | 2. 資料變形 5 | 3. 資料合併與分割 6 | -------------------------------------------------------------------------------- /customize_function/README.md: -------------------------------------------------------------------------------- 1 | # Chapter 7 - 自訂函數 2 | 3 | 1. 定義函數 4 | 2. 建立 .First 與 .Last 函數 5 | -------------------------------------------------------------------------------- /data_import_and_export/README.md: -------------------------------------------------------------------------------- 1 | # Chapter 4 - 資料匯入與輸出 2 | 3 | 1. 匯入資料 4 | 2. 輸出資料 5 | 3. 讀取資料庫的資料 6 | -------------------------------------------------------------------------------- /image/environment_settings/console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/image/environment_settings/console.png -------------------------------------------------------------------------------- /image/environment_settings/dash-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/image/environment_settings/dash-1.png -------------------------------------------------------------------------------- /image/environment_settings/dash-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/image/environment_settings/dash-2.png -------------------------------------------------------------------------------- /image/environment_settings/download-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/image/environment_settings/download-1.png -------------------------------------------------------------------------------- /image/environment_settings/download-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/image/environment_settings/download-2.png -------------------------------------------------------------------------------- /image/environment_settings/download-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/image/environment_settings/download-3.png -------------------------------------------------------------------------------- /image/environment_settings/download-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/image/environment_settings/download-4.png -------------------------------------------------------------------------------- /image/environment_settings/download-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/image/environment_settings/download-5.png -------------------------------------------------------------------------------- /image/environment_settings/download-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/image/environment_settings/download-6.png -------------------------------------------------------------------------------- /image/environment_settings/download-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/image/environment_settings/download-7.png -------------------------------------------------------------------------------- /image/environment_settings/download-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/image/environment_settings/download-8.png -------------------------------------------------------------------------------- /image/environment_settings/download-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joe11051105/R_basic/HEAD/image/environment_settings/download-9.png -------------------------------------------------------------------------------- /variable_and_data/README.md: -------------------------------------------------------------------------------- 1 | # Chapter 3 - 變數與資料 2 | 3 | 1. 變數 4 | 2. 向量 5 | 3. 矩陣 6 | 4. 因子 7 | 5. 串列 8 | 6. 資料框架 9 | 7. 時間數列 10 | 8. 指標 11 | -------------------------------------------------------------------------------- /environment_settings/README.md: -------------------------------------------------------------------------------- 1 | # Chapter 1 - 環境建置 2 | 3 | 1. 安裝與更新 R 4 | 2. 安裝 RStudio 5 | 3. Rstudio 基本介紹 6 | 4. 切換 R 版本 7 | 5. Concole 開啓 R console 8 | -------------------------------------------------------------------------------- /environment_settings/open_R_console.md: -------------------------------------------------------------------------------- 1 | # Concole 開啓 R console 2 | 3 | 此部份在本機時應該不會用到,因為大部份都是使用 RSudio,但是在 Server(尤其是 Ubuntu) 就有機會用到,可以在 console 直接輸入「R」,就可以進入 R console,如果想要離開可以輸入「q()」,或者也可以使用 RStudio Server 版本。 4 | 5 | ![Console](../image/environment_settings/console.png) 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 本書是根據本人學習 R 的經驗,加上整理歸納後所產出的筆記,有任何錯問題歡迎大家糾正與指教。 3 | 4 | # 本書涵蓋內容 5 | 1. 環境建置 6 | 2. 基本運算 7 | 3. 變數與資料 8 | 4. 資料匯入與輸出 9 | 5. 流程控制 10 | 6. 資料整理 11 | 7. 自訂函數 12 | 8. 繪圖功能 13 | 9. 文件撰寫 14 | 15 | # 作者資訊 16 | 本書由 [Joe](https://github.com/joe11051105) 所撰寫。 17 | 18 | # 原始碼 19 | 本書原始碼放置在 [Github](https://github.com/joe11051105/R_basic),歡迎大家直接 fork 修正內容有問題地方。 20 | -------------------------------------------------------------------------------- /customize_function/initialize.md: -------------------------------------------------------------------------------- 1 | # 建立 .First 與 .Last 函數 2 | 3 | R 可以利用 .First 與 .Last 函數,建立 R 環境 開始與結束時會自動執行的函數。 4 | 5 | + 建立 .Rprofile 檔案 6 | + 建立 .First 與.Last 函數 7 | 8 | ``` 9 | touch ~/.Rprofile 10 | 11 | open -a Textedit ~/.Rprofile 12 | ``` 13 | 14 | .Rprofile 檔案內容 15 | ``` 16 | .First = function() 17 | { 18 | library(ggplot2) # 開啓 RStudio 時會自動載入ggplot2package 19 | } 20 | 21 | .Last = function() 22 | { 23 | 24 | } 25 | ``` 26 | 27 | 註:以上是在 Mac 環境下操作,但不同環境應該大同小異。 28 | -------------------------------------------------------------------------------- /environment_settings/install_RStudio.md: -------------------------------------------------------------------------------- 1 | # 安裝 RStudio 2 | 3 | ### Step1:開啓 [RStudio](http://www.rstudio.com/) 官方網站 4 | 5 | ![Download R - Step1](../image/environment_settings/download-5.png) 6 | 7 | ### Step2:選擇 Desktop 版 8 | 9 | ![Download R - Step2](../image/environment_settings/download-6.png) 10 | 11 | ### Step3:選擇免費版 12 | 13 | ![Download R - Step3](../image/environment_settings/download-7.png) 14 | 15 | ### Step4:選擇作業系統(作者本身是 Mac) 16 | 17 | ![Download R - Step4](../image/environment_settings/download-8.png) 18 | 19 | ### Step5:執行下載的檔案完成安裝。 20 | -------------------------------------------------------------------------------- /customize_function/define_function.md: -------------------------------------------------------------------------------- 1 | # 定義函數 2 | 3 | R 可以將常重複執行的程式碼定義成函數,如以下定義 4 | 5 | ```r 6 | 函數名稱 <- function(參數){ 7 | 程式重複執行的部份 8 | } 9 | 10 | > add <- function(a, b){ 11 | + a + b 12 | + } 13 | > add(1,3) 14 | [1] 4 # R 預設最後一個運算式當作回傳的值 15 | 16 | > add_special <- function(a, b){ 17 | + c = a + b 18 | + return(0) # 可以自訂要回傳的部份 19 | + } 20 | > add_special(1,3) 21 | [1] 0 22 | 23 | > add_default <- function(a = 1, b = 2){ 24 | # 可以自訂函數的預設值 25 | + a + b 26 | + } 27 | > add_default() #沒給參數值 28 | [1] 3 29 | > add_default(2) # 給 a = 2,因為給定參數是依照參數順序,如果想給 b,但不想給定 a,可以利用以下方式 30 | [1] 4 31 | > add_default(b = 3) 32 | [1] 4 33 | ``` 34 | -------------------------------------------------------------------------------- /arrange_data/recode.md: -------------------------------------------------------------------------------- 1 | # 重新編碼 2 | 3 | 分析資料前常常需要再次整理資料,方便日後做分析,整理資料第一步往往是將資料的調整值經過一些調整,以下介紹幾種重新編碼的方法。 4 | 5 | + 透過邏輯判斷式 6 | + 利用 cut 函數 7 | 8 | 9 | ```r 10 | > data <- iris # 使用 R 內建的資料。 11 | 12 | > data$Sepal.Length <- ifelse(data$Sepal.Length > 5, 1,2) # Sepal.Length 如果大於 5 會變成 1,不會就會變成 2 13 | 14 | > data$Species <- ifelse(data$Species %in% c(setosa), "IsSetosa","Notsetosa") # %in% 代表有包含到的概念 15 | 16 | > x <- c(1, 5, 12, 18, 19, 21, 25, 31) 17 | > cut(x, c(0, 10, 20, 30, 40), c(5, 15, 25, 35)) # cut 函數是透過切割點,重新賦予資料新的數值,本範例的切割的範圍是 0 ~ 10、10 ~ 20、20 ~ 30、30 ~ 40,0 ~ 10 範圍的賦予新的值是 5。 18 | [1] 5 5 15 15 15 25 25 35 19 | Levels: 5 15 25 35 20 | ``` 21 | -------------------------------------------------------------------------------- /control_flow/logic_decision.md: -------------------------------------------------------------------------------- 1 | # 邏輯判斷式 2 | 3 | ### 常見的邏輯判斷符號 4 | 以下介紹常見的邏輯判斷的符號。 5 | 6 | + <、>:小於、大於。 7 | + <=、>=:小於等於、大於等於。 8 | + ==、!=:等於、不等於。 9 | + A %in% B:A 是否在 B 中。 10 | + &&、&:交集,& 適用於向量式的邏輯判斷,&& 適用於單一值的邏輯判斷。 11 | + ||、|:聯集,| 適用狀況與 & 相同,|| 適用狀況與 && 相同。 12 | 13 | ```r 14 | > x <- 5 15 | > y <- 10 16 | 17 | > x > 3 18 | [1] TRUE 19 | > x >= 6 20 | [1] FALSE 21 | 22 | > x <= 6 23 | [1] TRUE 24 | > x < 3 25 | [1] FALSE 26 | 27 | > !(x > 3) # 前面多加一個有否定功能,所以 True 變成 False,如果是 False 則變成 True。 28 | [1] FALSE 29 | 30 | > x %in% c(1:6) 31 | [1] TRUE 32 | 33 | > x > 4 || y > 10 34 | [1] TRUE 35 | > x > 4 && y > 10 36 | [1] FALSE 37 | 38 | > z = c(1,2,3) 39 | > z > 0 & z > -1 40 | [1] TRUE TRUE TRUE 41 | > z > 0 && z > -1 # && 只可以比較單一值,所以只有抓 z 的第一元素跟 0 與 -1 比較。 42 | [1] TRUE 43 | ``` 44 | 45 | 46 | -------------------------------------------------------------------------------- /variable_and_data/variable.md: -------------------------------------------------------------------------------- 1 | # 變數 2 | 3 | R 在給予變數值時是利用「<-」並不是程式語言中常見的「=」,在 [Google's R Style Guide](http://google-styleguide.googlecode.com/svn/trunk/Rguide.xml#assignment) 與 [R 官方文件](http://stat.ethz.ch/R-manual/R-patched/library/base/html/assignOps.html) 都強調不該使用「=」,因為在某些狀況是會失效的。另外在 R 變數命名上,大小寫是有區別的,所以 x 與 X 其實是不同的變數。 4 | 5 | ```r 6 | > x <- 1 7 | > y <- 2 8 | > x + y 9 | [1] 3 10 | 11 | > x1 <- x2 <- 1 # x1 與 x2 都是 1 12 | > x1 + x2 13 | [1] 2 14 | ``` 15 | 16 | R 的變數可以重複給予值,不會因為資料屬性的不同而發生錯誤,會因最後所給予的值為結果。所以程式碼複雜時,常常會因為一個變數重複給予不同的值而發生錯誤,這時可以用 exists 函數檢查。 17 | 18 | ```r 19 | > x = 1 20 | > x 21 | [1] 1 22 | > x = 1.3 23 | > x 24 | [1] 1.3 25 | > x = 1 + 2i 26 | > x 27 | [1] 1+2i 28 | > x = "test" 29 | > x 30 | [1] "test" 31 | > x = FALSE 32 | > x 33 | [1] FALSE 34 | 35 | > x = 10 36 | > exists("x") 37 | [1] TRUE 38 | ``` 39 | 40 | ### NA 與 NULL 41 | 42 | NA 代表是個空物件,已經有物件但是裡面沒東西,NULL 則是根本沒有任何東西,更詳細比較請參考 [R Bloggers R : NA vs. NULL](http://www.r-bloggers.com/r-na-vs-null/) 43 | -------------------------------------------------------------------------------- /environment_settings/install_R.md: -------------------------------------------------------------------------------- 1 | # 安裝與更新 R 2 | 3 | ### Step1:開啓 [R](http://www.r-project.org) 官方網站 4 | 5 | ![Download R - Step1](../image/environment_settings/download-1.png) 6 | 7 | ### Step2:選擇 Taiwan 任一個載點 8 | 9 | ![Download R - Step2](../image/environment_settings/download-2.png) 10 | 11 | ### Step3:選擇作業系統(作者本身是 Mac) 12 | 13 | ![Download R - Step3](../image/environment_settings/download-3.png) 14 | 15 | ### Step4:選擇下載的項目(有三種) 16 | 17 | 1. 下載 R 且包含 R GUI 界面的 software。 18 | 2. 下載 R。 19 | 3. 下載 R GUI 界面的原始程式碼。 20 | 21 | => 選擇 1 或 2 都可以,第一次安裝可以選擇 1,看看 GUI 畫面是什麼樣子,但之後會介紹 RStudio 比原始的 GUI 好用很多。 22 | 23 | ![Download R - Step4](../image/environment_settings/download-4.png) 24 | 25 | ### Step5:執行下載的檔案完成安裝。 26 | 27 | ### 更新 R 的版本 28 | 因為 R 版本會不定時更新,該如何更新 R,其實跟安裝 R 的步驟一致,但在 step4 請都選 (2) 選項,不然會多很多不同版本的 GUI software。R 可以同時安裝多的版本在同一台電腦,該如何查詢電腦所有 R 的版本,請看以下介紹。 29 | 30 | Windows 31 | 32 | 請查看 C:\Program Files\R 33 | 34 | Mac OS X 35 | 36 | 請查看 /Library/Frameworks/R.framework/Versions 37 | -------------------------------------------------------------------------------- /environment_settings/install_and_load_package.md: -------------------------------------------------------------------------------- 1 | ### 安裝載入 package 2 | 3 | ### 安裝 package 4 | 5 | 安裝 package 有以下兩種方式: 6 | 7 | + 透過右下角 Packages -> Install Packages 安裝套件 8 | + 在 console 輸入指令安裝 9 | 10 | ```r 11 | > install.packages("ggplot2") # 下載 ggplot2 套件 12 | ``` 13 | 14 | ### 載入 package 15 | 16 | 載入 package 有以下料、兩種方式: 17 | 18 | + 透過右下角 Package,將要載入的 package 打勾即可。 19 | + 在 console 輸入指令載入 20 | 21 | ```r 22 | > library(ggplot2) # ggplot2 一個畫圖套件。 23 | 24 | > require(ggplot2) # library 與 require 都是載入 package,但是最大的差別在於,library 如果是載入的 package 不存在,是會發生 error 程式停止,但是 require 卻不會。 25 | ``` 26 | 27 | 不過以上下載的套件是指發佈在 CRAN 上的,但如果沒有發佈在 CRAN,而是發佈在 Github 上該怎麼辦,可以利用 devtools package 實作此部份。 28 | 29 | ```r 30 | > install.packages("devtools") 31 | > require(devtools) 32 | > install_github("rpensoft", "ropensci") # package 名稱為 rpensoft,repository 名稱為 ropensci,對應到的 github 網址為 https://github.com/ropensci/rpensoft。 33 | ``` 34 | 35 | 至於 Bioconductor package 下載的部份,可以參考[官網](http://master.bioconductor.org/install/#install-bioconductor-packages)的介紹。 36 | -------------------------------------------------------------------------------- /variable_and_data/list.md: -------------------------------------------------------------------------------- 1 | # 列表 2 | 3 | ### 利用 list 建立列表 4 | 列表跟向量很相似,但最大的不同在於列表可以包含不同資料屬性的資料。 5 | 6 | ```r 7 | > x <- list(a = 1, b = TRUE, c = "test", d = c(1, 2, 3)) 8 | > x 9 | $a 10 | [1] 1 11 | 12 | $b 13 | [1] TRUE 14 | 15 | $c 16 | [1] "test" 17 | 18 | $d 19 | [1] 1 2 3 20 | ``` 21 | 22 | ### 透過指標與名稱提取資料 23 | 24 | ```r 25 | > x <- list(a = 1, b = TRUE, c = "test", d = c(1, 2, 3)) 26 | 27 | > x[1] 28 | $a 29 | [1] 1 30 | 31 | > x[[1]] 32 | [1] 1 33 | 34 | > x$b # 是利用 % 加上名稱提取資料 35 | [1] TRUE 36 | 37 | > x[[4]][1] # x[[4]] 取出第四個值,因為第四個值是向量,所以可以在取一次指標,取出向量的元素值。 38 | [1] 1 39 | ``` 40 | 41 | ### 基本相關函數 42 | 43 | + as.list:建立列表 44 | + is.list:判斷是否為列表 45 | + attributes:查看所有元素的名稱,names 也有相同功能。 46 | 47 | ```r 48 | > x <- list(a = 1, b = TRUE, c = "test", d = c(1, 2, 3)) 49 | 50 | > as.list(c(1,2,3)) 51 | [[1]] 52 | [1] 1 53 | 54 | [[2]] 55 | [1] 2 56 | 57 | [[3]] 58 | [1] 3 59 | 60 | > is.list(x) 61 | [1] TRUE 62 | 63 | > attributes(x) 64 | $names 65 | [1] "a" "b" "c" "d" 66 | 67 | > names(x) 68 | [1] "a" "b" "c" "d" 69 | ``` 70 | -------------------------------------------------------------------------------- /data_import_and_export/load_database.md: -------------------------------------------------------------------------------- 1 | # 讀取資料庫的資料 2 | 3 | ### 讀取資料庫的資料 4 | 利用 DBI、gWidgets、RMySQL 與 dbConnect 等 package 讀取資料庫資料,以下是讀取 MySQL 資料庫當作範例。 5 | 6 | ```r 7 | > library(DBI) # DBI 是 R Database Interface 8 | > library(gWidgets) 9 | > library(RMySQL) # MySQL 在 R 的 INterface 10 | > library(dbConnect) 11 | > con <- dbConnect(MySQL(), dbname = "house_development", username="root", password="123456") # 建立資料庫連線 12 | > 13 | > dbSendQuery(con,"SET NAMES utf8") #需設定 UTF-8,不然中文會亂碼。 14 | 15 | > dbClearResult(dbListResults(con)[[1]]) 16 | [1] TRUE 17 | > 18 | > dbGetQuery(con,"show variables like 'character_set_%'") # 查詢資料庫基本設定 19 | Variable_name Value 20 | character_set_client utf8 21 | character_set_connection utf8 22 | character_set_database utf8 23 | character_set_filesystem binary 24 | character_set_results utf8 25 | character_set_server utf8 26 | character_set_system utf8 27 | character_sets_dir /usr/local/Cellar/mysql/5.6.12/share/mysql/charsets/ 28 | 29 | data = dbGetQuery(con, "select * from raws") # 使用 SQL query 讀取資料。 30 | ``` 31 | 32 | 註:如果資料庫不太熟,卻又想學習基本的語法的話,推薦 [新SQL 基礎講座 <增訂第二版>](http://www.books.com.tw/products/0010396522),此本的好處是記載不同資料庫的語法且淺顯易懂。 33 | -------------------------------------------------------------------------------- /basic_operation/data_attribute.md: -------------------------------------------------------------------------------- 1 | # 資料屬性 2 | R 的基本資料屬性包含以下五種,可用 class 函數判斷資料屬性 3 | 4 | + character:文字字串,用 "" 包起來,ex:"test" 5 | + numeric:實數 6 | + integer:整數 7 | + complex:複數 8 | + logical:True 或 False 9 | 10 | ```r 11 | > class("test") 12 | [1] "character" 13 | 14 | > class(10.10) 15 | [1] "numeric" 16 | 17 | > class(10) 18 | [1] "numeric" 19 | 20 | > class(as.integer(3)) # 因為 R 計算上是都是以雙倍精確度來計算,所以必須指定為 integer,不然都會被當成 numeric 看待。 21 | [1] "integer" 22 | 23 | > class(as.integer(3.1)) # as.integer 可以將不是整數的數值變成整數 24 | [1] "integer" 25 | 26 | > class(as.integer(T)) # as.integer(T) = 1 27 | [1] "integer" 28 | 29 | > class(as.integer(F)) # as.integer(T) = 0 30 | [1] "integer" 31 | 32 | > class(2+2i) 33 | [1] "complex" 34 | 35 | > class(TRUE) # 注意都要大寫,不可寫 True,但可以簡化成 T 36 | [1] "logical" 37 | 38 | > class(T) 39 | [1] "logical" 40 | ``` 41 | 註: 42 | + as.integer 切記不可以傳 character 進去,因為會產生 NA,如果傳 complex 進去,則會將虛數的部份則會自動捨棄。 43 | + 可以用 is.integer(x) 判斷是否為整數。 44 | + complex 也有跟 integer 類似的函數,as.complex 與 is.complex。 45 | + logical 也有跟 integer 類似的函數,as.logical 與 is.logical 46 | 47 | | | character | numeric | integer | complex | logical | 48 | | -- | :--: | :--: | :--: | :--: | :--: | 49 | | as.integer | X | O | O | O | O | 50 | | is.integer | F | F | T | F | F | 51 | -------------------------------------------------------------------------------- /arrange_data/reshape.md: -------------------------------------------------------------------------------- 1 | # 資料變形 2 | 3 | 在第三章常提到 as 開頭的函數,例如:as.vector、as.array、as.matric、as.data.frame 等,其實就是資料變形函數的一種,以下介紹其他常用到的資料變形函數。 4 | 5 | + stack 與 unstack 函數 6 | + reshape 函數 7 | 8 | ```r 9 | > data <- iris # 使用 R 內建的資料。 10 | 11 | > stack_data <- stack(data) # stack 函數將各行資料排成一直行,unstack 則是還原成未 stack 之前形態。 12 | 13 | > library("longitudinalData") 14 | > data <- artificialJointLongData # 此種資料稱作為縱向資料(Longitudinal Data),通常是單一物體重複測量值所產生的資料,記錄方式可以用長型資料(long format)或寬型資料(wide format)。 15 | 16 | > data_long = reshape(data, direction="long", varying = list(c("v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10"), c("w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10"), c("x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10")), v.names = c("v", "w", "x"), idvar = "id") # 利用 reshape 函數將資料從 wide 轉成 long 17 | 18 | > data_wide = reshape(data_long, direction="wide",v.names = c("v", "w", "x"), idvar = "id") # 利用 reshape 函數將資料從 long 轉成 wide 19 | ``` 20 | 21 | 解釋以上 reshape 函數一些參數的用意。 22 | 23 | + direction:資料要轉成哪種類型,long 或 wide。 24 | + varying:用於 wide 轉 long 時,哪些欄位要變成一個欄位的長期觀察資料,例如 v0 ~ v1 要變成 v,w0 ~ w10 變成 w,x0 ~ x10 變成 x。 25 | + v.names:對於 wide 轉 long 時,當作是 long 資料的欄位,對於 long 轉 wide,哪些欄位要變成多個欄位觀察值。 26 | + idvar:非重複性觀察資料,多半是可以分辨觀察物體的變數,,例如:id、名稱等。 27 | -------------------------------------------------------------------------------- /control_flow/conditional_execution.md: -------------------------------------------------------------------------------- 1 | # 條件執行 2 | 3 | ### 常見的條件執行 4 | 5 | 以下介紹三種常見的條件執行。 6 | 7 | + if else 8 | + if else if else 9 | + switch 10 | 11 | ```r 12 | # if A 判斷式 13 | # A 判斷式為 True,會執行此區段程式碼。 14 | # else 15 | # A 判斷式為 False,會執行此區段程式碼。 16 | 17 | > x <- 1 18 | 19 | > if (x > 0) { 20 | + y <- 5 21 | + } else { 22 | + y <- 10 23 | + } 24 | 25 | > if (x > 0) y <- 5 else y <- 10 # 單行的寫法。 26 | > y 27 | [1] 5 28 | 29 | > y <- ifelse(x > 0, 5, 10) # 利用 ifelse(判斷式, True 給 5, False 給 10)。 30 | > y 31 | [1] 5 32 | 33 | # if A 判斷式 34 | # A 判斷式為 True,會執行此區段程式碼。 35 | # else if B 判斷式 36 | # B 判斷式為 True,會執行此區段程式碼。 37 | # else 38 | # A 與 B 判斷式都是 False,會執行此區段程式碼。 39 | 40 | + y <- 5 41 | + } else if (x > 2) { 42 | + y <- 10 43 | + } else { 44 | + y <- 3 45 | + } 46 | > y 47 | [1] 3 48 | 49 | # switch(回傳數值代表執行第幾個程式片段, 程式片段 1, ..., 程式片段 N) 50 | # switch(回傳名稱代表執行哪個名稱的程式片段, 程式名稱 A 片段, ..., 程式名稱 N 片段) 51 | 52 | > switch(3, 10, 3 + 5, 3 / 3) 53 | [1] 1 54 | > switch(1, 10, 3 + 5, 3 / 3) 55 | [1] 10 56 | > switch(2, 10, 3 + 5, 3 / 3) 57 | [1] 8 58 | 59 | > switch("first", first = 1 + 1, second = 1 + 2, third = 1 + 3) 60 | [1] 2 61 | > switch("second", first = 1 + 1, second = 1 + 2, third = 1 + 3) 62 | [1] 3 63 | > switch("third", first = 1 + 1, second = 1 + 2, third = 1 + 3) 64 | [1] 4 65 | ``` 66 | -------------------------------------------------------------------------------- /control_flow/loop.md: -------------------------------------------------------------------------------- 1 | # 迴圈結構 2 | 3 | ### 常見的迴圈結構 4 | 5 | 以下介紹三種迴圈與兩種改變迴圈狀態的方法。 6 | 7 | + for 8 | + while 9 | + repeat 10 | + break 11 | + next 12 | 13 | ```r 14 | > y <- 0 15 | > for (x in c(1:10)) y <- x + y # 1 加到 10,迴圈就是重複執行相同動作,x 依序帶入 1 到 10,第一次帶入 1 時,y = 0,所以是 1 + 0 = 1,第二次帶入時,x = 1,y 已經變成 1,所以變成 1 + 1 = 2,後面一直延續到 x = 10 迴圈就會停止。 16 | 17 | > y <- 0 18 | > for (x in c(1:10)) { 19 | + y <- x + y 20 | + } 21 | 22 | > x <- 1 23 | > y <- 0 24 | > while (x <= 10) { # while 只要符合判斷式,就會一直重複執行括號內程式碼,直到不符合為止。 25 | + y <- x + y 26 | + x <- x + 1 # 這行很重要,如果沒有這行,程式碼會一直執行不會停止,因為判斷式是 x 小於等於 10,x 初始值是 0,如果不對 x 做些動作,x 會一直小於等於 10,所以這邊加 1,是希望執行到 x = 11 時,迴圈就會停止。 27 | + } 28 | 29 | > x <- 1 30 | > y <- 0 31 | repeat { # repeat 與 while 有點類似,只是判斷式的部份,可以比較自由寫在括號內任一地方,且跳出迴圈是利用 break 方式。 32 | > repeat { 33 | + if (x > 10) break # break 是會執行跳出迴圈的動作, 34 | 意味程式停止。 35 | + 36 | + y <- x + y 37 | + x <- x + 1 38 | + } 39 | 40 | > x <- 1 41 | > y <- 0 42 | > repeat { 43 | + if (x > 10) { # 此部份判斷式多了一個 x = 5 部份 44 | + break 45 | + } else if (x == 5) { 46 | + x <- x + 1 47 | + next # next 是指跳過此次的迴圈,執行下一次的迴圈,所以這邊會被跳過 x = 5,代表 5 不會被加到,那有人有疑惑那為何上面要有一個 x <- x + 1,因為跳過 x 還是需要執行加 1 的動作,不然程式只會到 5 不會到 6,想要測試此狀況,就把 x <- x + 1 改成 print(x),就會發現程式一直跑停不下來。 48 | + } 49 | + 50 | + y <- x + y 51 | + x <- x + 1 52 | + } 53 | ``` 54 | -------------------------------------------------------------------------------- /data_import_and_export/export_data.md: -------------------------------------------------------------------------------- 1 | # 輸出資料 2 | 3 | ### 透過 write.table 輸出資料 4 | 以下利用 write.table 輸出 CSV 檔案。 5 | 6 | ```r 7 | data <- iris # iris 是 R 內建的資料。 8 | write.table(data, file = "test.CSV", sep = ",") 9 | ``` 10 | 11 | ### 輸出 XML 檔案 12 | 跟輸入 XML 檔案一樣,是使用 XML package 來實做,但會需要利用到建立 tag 的函數。 13 | 14 | ```r 15 | > data <- iris 16 | > xml <- xmlTree() 17 | > xml$addTag("document", close = FALSE) # 建立一個名為 document 的 tag。 18 | > for (i in 1:nrow(data)) { 19 | + xml$addTag("row", close = FALSE) # 建立一個名為 row 的 tag。 20 | + for (j in names(data)) { 21 | + xml$addTag(j, data[i, j]) # j 為欄位名稱,所以是依序建立不同欄為名稱的 tag, 並賦予值與結束此 tag。 22 | + } 23 | + xml$closeTag() # 建立 tag 時,如果有下參數 close = FALSE 的話,記得要在結束 tag 地方下 closeTag()。 24 | + } 25 | > xml$closeTag() 26 | > saveXML(xml, "test.xml") 27 | [1] "test.xml" 28 | ``` 29 | 30 | XML 檔案輸出結果。 31 | ```xml 32 | 33 | 34 | 35 | 5.1 36 | 3.5 37 | 1.4 38 | 0.2 39 | setosa 40 | 41 | . 42 | . 43 | . 44 | . 45 | 46 | ``` 47 | 48 | ### 輸出 RDA 檔案 49 | 50 | 利用 save 函數輸出 RDA 檔案。 51 | 52 | ```r 53 | > data <- iris 54 | > save(data, file="test.rda") 55 | ``` 56 | -------------------------------------------------------------------------------- /environment_settings/Change_R_version.md: -------------------------------------------------------------------------------- 1 | # 切換 R 的版本 2 | 3 | 因為有時候會安裝多個 R 的版本,但是 RStudio 通常系統會抓最新的版本當作目前的版本,但是有時需要換成舊的 R 版本?請參考以下程式碼(針對 Mac)。 4 | 5 | ### Step1 查看目前的版本 6 | 7 | ``` 8 | cd /Library/Frameworks/R.framework/Versions 9 | ls -al 10 | 11 | total 8 12 | drwxrwxr-x 5 root admin 170 8 10 17:02 . 13 | drwxrwxr-x 8 root admin 272 8 10 17:02 .. 14 | drwxrwxr-x 6 root admin 204 8 11 22:08 3.0 15 | drwxrwxr-x 6 root admin 204 8 11 22:04 3.1 16 | lrwxr-xr-x 1 root admin 3 8 10 17:02 Current -> 3.1 17 | ``` 18 | 19 | ### Step 2刪除 Current 20 | 21 | ``` 22 | rm -rf Current 23 | ls -al 24 | 25 | total 0 26 | drwxrwxr-x 4 root admin 136 8 11 22:26 . 27 | drwxrwxr-x 8 root admin 272 8 10 17:02 .. 28 | drwxrwxr-x 6 root admin 204 8 11 22:08 3.0 29 | drwxrwxr-x 6 root admin 204 8 11 22:04 3.1 30 | ``` 31 | 32 | ### Step 3 建立新的 Creent,並指向 3.0 版本 33 | 34 | ``` 35 | ln -s 3.0 Current 36 | ls -al 37 | 38 | total 8 39 | drwxrwxr-x 5 root admin 170 8 11 22:26 . 40 | drwxrwxr-x 8 root admin 272 8 10 17:02 .. 41 | drwxrwxr-x 6 root admin 204 8 11 22:08 3.0 42 | drwxrwxr-x 6 root admin 204 8 11 22:04 3.1 43 | lrwxr-xr-x 1 joe admin 3 8 11 22:26 Current -> 3.0 44 | ``` 45 | 46 | 註:Windows & Linux 的部分可以參考 [RStudio](https://support.rstudio.com/hc/en-us/articles/200486138-Using-Different-Versions-of-R) 官方文件 47 | 48 | -------------------------------------------------------------------------------- /basic_operation/common_operation.md: -------------------------------------------------------------------------------- 1 | # 常見運算 2 | 3 | ### 加減乘除 4 | 5 | ```r 6 | > 1 + 2 7 | [1] 3 8 | 9 | > 1 - 2 10 | [1] -1 11 | 12 | > 1 * 2 13 | [1] 2 14 | 15 | > 1 / 2 16 | [1] 0.5 17 | ``` 18 | ### 次方、平方根、商數與餘數 19 | 20 | ```r 21 | > 2 ^ 3 # 2 的 3 次方 22 | [1] 8 23 | 24 | > 2 ** 3 # 2 的 3 次方 25 | [1] 8 26 | 27 | > sqrt(4) # 4 的平方根 28 | [1] 2 29 | 30 | > 27 ^ (1/3) # 27 的立方根 31 | [1] 3 32 | 33 | > 11 %/% 5 # 11 除以 5 的商數 34 | [1] 2 35 | 36 | > 11 %% 5 # 11 除以 5 的餘數 37 | [1] 1 38 | ``` 39 | 40 | 註:# 為 R 的註解符號,並不會執行。 41 | 42 | ### sign:判斷是正、負數或 0 43 | 44 | + 正數回傳 1 45 | + 負數回傳 -1 46 | + 0 回傳 0 47 | 48 | ```r 49 | > sign(10) 50 | [1] 1 51 | 52 | > sign(0) 53 | [1] 0 54 | 55 | > sign(-10) 56 | [1] -1 57 | ``` 58 | 59 | ### abs:取絕對值 60 | 61 | ```r 62 | > abs(10) 63 | [1] 10 64 | 65 | > abs(0) 66 | [1] 0 67 | 68 | > abs(-10) 69 | [1] 10 70 | ``` 71 | 72 | ### log 73 | 74 | ```r 75 | > log(10) # log 以 e 為底 76 | [1] 2.302585 77 | 78 | > log1p(9) # log(x) = log1p(x - 1) 79 | [1] 2.302585 80 | 81 | > log(10, 2) # 指定 log 以 2 為底 82 | [1] 3.321928 83 | 84 | > log2(10) # log2 代表以 2 為底 85 | [1] 3.321928 86 | 87 | > log10(10) # log10 代表以 10 為底 88 | [1] 1 89 | 90 | ``` 91 | 92 | ### exp 93 | 94 | ```r 95 | > exp(10) 96 | [1] 22026.47 97 | 98 | > expm1(10) # expm1(x) = exp(x) - 1 99 | [1] 22025.47 100 | ``` 101 | -------------------------------------------------------------------------------- /variable_and_data/factor.md: -------------------------------------------------------------------------------- 1 | ### 因子 2 | 3 | ### 利用 factor 建立因子 4 | 5 | 因子有點像經過分級之後的向量,因子大多可以用在統計上的迴歸分析與實際設計等。 6 | 7 | ```r 8 | > x <- c(1, 2, 4, 3, 1, 2, 3, 4,1) 9 | > factor(x) 10 | [1] 1 2 4 3 1 2 3 4 1 11 | Levels: 1 2 3 4 12 | 13 | > factor(x, labels = c("一", "二", "三", "四")) # 可自訂 Level 的名稱。 14 | [1] 一 二 四 三 一 二 三 四 一 15 | Levels: 一 二 三 四 16 | 17 | > factor(x, ordered = TRUE) # ordered 代表可做排序 18 | [1] 1 2 4 3 1 2 3 4 1 19 | Levels: 1 < 2 < 3 < 4 20 | 21 | > factor(c(1, 2, 1, NA, 2), exclude = NA) # 可利用 exclude 排除特定資料。 22 | [1] 1 2 1 2 23 | Levels: 1 2 24 | 25 | > factor(c(1, 2, 1, NA, 2), exclude = 2) 26 | [1] 1 1 27 | Levels: 1 28 | 29 | > factor(c(1, 2, 1, NA, 2), exclude = NULL) # 不排除任何資料。 30 | [1] 1 2 1 2 31 | ``` 32 | 33 | ### 透過指標提取資料 34 | 35 | ```r 36 | > x[1] # [] 與 [[]] 結果一致,因為因子只有值沒有其他相關資料。 37 | [1] 1 38 | > x[[1]] 39 | [1] 1 40 | 41 | > x[1:2] # 指標可以使用向量。 42 | [1] 1 2 43 | 44 | > x[c(1, 3, 5)] 45 | [1] 1 4 1 46 | ``` 47 | 48 | 49 | ### 基本相關函數 50 | 51 | + is.factor:判斷是否為因子。 52 | + as.factor:將變數轉為因子。 53 | + is.ordered:判斷是否為排序過的因子。 54 | + as.ordered:將因子排序。 55 | + which:找出符合條件的指標。 56 | 57 | ```r 58 | > x <- c(1, 2, 4, 3, 1, 2, 3, 4,1) 59 | 60 | > as.factor(x) 61 | [1] 1 2 4 3 1 2 3 4 1 62 | Levels: 1 2 3 4 63 | > is.factor(x) 64 | [1] FALSE 65 | > is.factor(as.factor(x)) 66 | [1] TRUE 67 | 68 | > is.ordered(factor(x, ordered = TRUE)) 69 | [1] TRUE 70 | > is.ordered(factor(x, ordered = FALSE)) 71 | [1] FALSE 72 | > as.ordered(factor(x)) 73 | [1] 1 2 4 3 1 2 3 4 1 74 | Levels: 1 < 2 < 3 < 4 75 | 76 | > which(x == 1) # 找出 x 等於 1 的指標 77 | [1] 1 5 9 78 | ``` 79 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | 3 | * [Introduction](README.md) 4 | * [Chapter 1 - 環境建置](environment_settings/README.md) 5 | * [安裝與更新 R](environment_settings/install_R.md) 6 | * [安裝 RStudio](environment_settings/install_RStudio.md) 7 | * [Rstudio 基本介紹](environment_settings/RStudio_introduction.md) 8 | * [切換 R 的版本](environment_settings/Change_R_version.md) 9 | * [Console 開啓 R console](environment_settings/open_R_console.md) 10 | * [安裝載入 package](environment_settings/install_and_load_package.md) 11 | * [Chapter 2 - 基本運算](basic_operation/README.md) 12 | * [資料屬性](basic_operation/data_attribute.md) 13 | * [常見運算](basic_operation/common_operation.md) 14 | * [Chapter 3 - 變數與資料](variable_and_data/README.md) 15 | * [變數](variable_and_data/variable.md) 16 | * [向量](variable_and_data/vector.md) 17 | * [陣列](variable_and_data/array.md) 18 | * [矩陣](variable_and_data/matrix.md) 19 | * [因子](variable_and_data/factor.md) 20 | * [列表](variable_and_data/list.md) 21 | * [資料框架](variable_and_data/data_frame.md) 22 | * [Chapter 4 - 資料匯入與輸出](data_import_and_export/README.md) 23 | * [匯入資料](data_import_and_export/import_data.md) 24 | * [輸出資料](data_import_and_export/export_data.md) 25 | * [讀取資料庫的資料](data_import_and_export/load_database.md) 26 | * [Chapter 5 - 流程控制](control_flow/README.md) 27 | * [邏輯判斷式](control_flow/logic_decision.md) 28 | * [條件執行](control_flow/conditional_execution.md) 29 | * [迴圈結構](control_flow/loop.md) 30 | * [Chapter 6 - 資料整理](arrange_data/README.md) 31 | * [重新編碼](arrange_data/recode.md) 32 | * [資料變形](arrange_data/reshape.md) 33 | * [資料合併與分割](arrange_data/merge_and_subsetting.md) 34 | * [Chapter 7 - 自訂函數](customize_function/README.md) 35 | * [定義函數](customize_function/define_function.md) 36 | * [建立 .First 與 .Last 函數](customize_function/initialize.md) 37 | 38 | -------------------------------------------------------------------------------- /variable_and_data/data_frame.md: -------------------------------------------------------------------------------- 1 | # 資料框架 2 | 3 | ### 利用 data.frame 建立資料框架 4 | 5 | 資料框架類似資料表,常當作大量資料集,例如:匯入外部檔或讀取資料庫資料等。 6 | 7 | ```r 8 | > name <- c("Joe", "Bob", "Vicky") 9 | > age <- c("28", "26", "34") 10 | > gender <- c("Male","Male","Female") 11 | > data <- data.frame(name, age, gender) 12 | > View(data) # 自動點選 data 變數就會開啟資料的畫面。 13 | ``` 14 | 15 | ### 透過指標與名稱提取資料 16 | 資料框架的提取資料方法跟矩陣或陣列的都很類似。 17 | 18 | ```r 19 | > data 20 | n a g 21 | r1 Joe 28 Male 22 | r2 Bob 26 Male 23 | r3 Vicky 34 Female 24 | 25 | > data[1,] 26 | name age gender 27 | 1 Joe 28 Male 28 | > data[,1] 29 | [1] Joe Bob Vicky 30 | Levels: Bob Joe Vicky 31 | > data[1, 1] 32 | [1] Joe 33 | Levels: Bob Joe Vicky 34 | 35 | > data[,"name"] 36 | [1] Joe Bob Vicky 37 | Levels: Bob Joe Vicky 38 | > data[1:2,"name"] 39 | [1] Joe Bob 40 | Levels: Bob Joe Vicky 41 | > data$name[1:2] 42 | [1] Joe Bob 43 | Levels: Bob Joe Vicky 44 | ``` 45 | 46 | ### 基本相關函數 47 | + head:取得資料框架前六比資料(預設是 6)。 48 | + names:修改或查詢 column 名稱。 49 | + colnames:設定 column 名稱。 50 | + row.names:修改或查詢 row 名稱。 51 | + rownames:設定 row 的名稱 52 | + summary:顯示資料基本資訊。 53 | 54 | ```r 55 | > data 56 | n a g 57 | r1 Joe 28 Male 58 | r2 Bob 26 Male 59 | r3 Vicky 34 Female 60 | 61 | > head(data) # 因為筆數不夠多,所以全部都顯示。 62 | n a g 63 | r1 Joe 28 Male 64 | r2 Bob 26 Male 65 | r3 Vicky 34 Female 66 | 67 | > head(data, 1L) # 只顯示第一筆資料。 68 | n a g 69 | r1 Joe 28 Male 70 | 71 | > names(data) 72 | [1] "name" "age" "gender" 73 | > names(data) <- c("n", "a", "g") 74 | > names(data) 75 | [1] "n" "a" "g"" 76 | > colnames(data) 77 | [1] "n" "a" "g" 78 | 79 | > row.names(data) 80 | [1] "1" "2" "3" 81 | > row.names(data) <- c("r1", "r2", "r3") 82 | > row.names(data) 83 | [1] "r1" "r2" "r3" 84 | > rownames(data) 85 | [1] "r1" "r2" "r3" 86 | 87 | > summary(data) 88 | name age gender 89 | Bob :1 26:1 Female:1 90 | Joe :1 28:1 Male :2 91 | Vicky:1 34:1 92 | ``` 93 | -------------------------------------------------------------------------------- /variable_and_data/array.md: -------------------------------------------------------------------------------- 1 | # 陣列 2 | 3 | ### 利用 rbind、cbind 與 array 函數建立陣列 4 | 5 | 陣列可視為多維度的向量變數,跟向量一樣,所有陣列元素的資料屬性必須一致。 6 | 7 | ```r 8 | > x <- c(1, 2, 3) 9 | > y <- c(4, 5, 6) 10 | 11 | > rbind(x, y) # rbind 是利用 row(橫) 合併。 12 | [,1] [,2] [,3] 13 | x 1 2 3 14 | y 4 5 6 15 | 16 | > cbind(x, y) # cbind 是利用 column(直) 合併。 17 | x y 18 | [1,] 1 4 19 | [2,] 2 5 20 | [3,] 3 6 21 | 22 | > array(x,c(1,3)) # c(1,3) 代表產生 1 x 3 陣列 23 | [,1] [,2] [,3] 24 | [1,] 1 2 3 25 | 26 | > array(x,c(2,3)) # c(2,3) 代表產生 2 x 3 陣列 27 | [,1] [,2] [,3] 28 | [1,] 1 3 2 29 | [2,] 2 1 3 30 | 31 | > array(x,c(3,3)) # c(3,3) 代表產生 3 x 3 陣列 32 | [,1] [,2] [,3] 33 | [1,] 1 1 1 34 | [2,] 2 2 2 35 | [3,] 3 3 3 36 | ``` 37 | ### 透過指標提取資料 38 | 陣列與向量相同,可以透過指標或名稱選取陣列的元素。 39 | 40 | ```r 41 | > x <- c(1, 2, 3) 42 | > y <- c(4, 5, 6) 43 | 44 | > z = rbind(x, y) 45 | > z 46 | [,1] [,2] [,3] 47 | x 1 2 3 48 | y 4 5 6 49 | 50 | > z[,1] # 選取第一行(column、直) 51 | x y 52 | 1 4 53 | 54 | > z[1,] # 選取第一列(row、橫) 55 | [1] 1 2 3 56 | 57 | > z[1,1:2] # 選取第一列第一到二行 58 | [1] 1 2 59 | ``` 60 | 61 | ### 基本相關函數 62 | 63 | + 陣列加減乘除 64 | + length:計算陣列中的所有元素個數。 65 | + dim:列出維度資訊 66 | + ncol、nrow:計算(column、直) 或 (row、橫) 個數。 67 | + aperm:將陣列轉置 68 | 69 | 70 | ```r 71 | > x <- c(1, 2, 3) 72 | > y <- c(4, 5, 6) 73 | 74 | > z = rbind(x, y) 75 | > z 76 | [,1] [,2] [,3] 77 | x 1 2 3 78 | y 4 5 6 79 | 80 | > z + z 81 | [,1] [,2] [,3] 82 | x 2 4 6 83 | y 8 10 12 84 | 85 | > z - 2*z 86 | [,1] [,2] [,3] 87 | x -1 -2 -3 88 | y -4 -5 -6 89 | 90 | > z * z # 相對應的陣列元素相乘 91 | [,1] [,2] [,3] 92 | x 1 4 9 93 | y 16 25 36 94 | 95 | > z / z # 相對應的陣列元素相除 96 | [,1] [,2] [,3] 97 | x 1 1 1 98 | y 1 1 1 99 | 100 | > length(z) 101 | [1] 6 102 | 103 | > dim(z) # 前者是 row,後者是 column。 104 | [1] 2 3 105 | > ncol(z) 106 | [1] 3 107 | > nrow(z) 108 | [1] 2 109 | 110 | > aperm(z) # 等同是從 rbind 轉成 cbind 111 | x y 112 | [1,] 1 4 113 | [2,] 2 5 114 | [3,] 3 6 115 | ``` 116 | -------------------------------------------------------------------------------- /data_import_and_export/import_data.md: -------------------------------------------------------------------------------- 1 | # 匯入資料 2 | 3 | 4 | ### 透過 read.table 匯入資料。 5 | 6 | read.table 可以讀取大多數的 ASCII 資料,以下先以 CSV 檔為代表,因為是目前最普遍見到的匯入資料格式。 7 | 8 | ```r 9 | > data <- read.table("Desktop/data.csv", header = TRUE, sep = ",") # 檔案路徑是相對於目前的工作目錄,header 是指資料是否有包含欄位名稱,sep 是指資料的分隔符號。 10 | 11 | > data <- read.table("Desktop/data.csv", header = TRUE, sep = ",", col.names = c("時間", "新聞標題")) # col.names 設定 column 欄位名稱。 12 | 13 | > data <- read.table("Desktop/data.csv", header = FALSE, sep = ",", skip = 10) # skip 是指跳過前 X 筆資料,這個部份要注意,要跳過資料,column 欄位就不可以出現在資料裡,因為它也被算在要 skip 部份。 14 | 15 | > data <- read.table("Desktop/data.csv", header = TRUE, sep = ",", encoding = "UTF-8") # encoding 是指定檔案的文字編碼 16 | 17 | > data <- read.table("Desktop/data.csv", header = TRUE, sep = ",", na.strings = NA) # na.strings 指定發生 NA 要用什麼符號代替。 18 | ``` 19 | 20 | ### 文字編碼問題 21 | 22 | 匯入 CSV 檔的時候會碰到一種比較特別的問題,就是作業系統編碼不同的問題,Windows 的中文編碼是 big5,而 Linux / Mac 都是 UTF-8,所以在 Linux / Mac 匯入來自於 Windows CSV 檔常常會發生亂碼,那該如何解決此問題,本人的做法是將資料讀進來轉成 UTF-8,在輸出一份 CSV 檔,以下先以一個 CSV 檔為主,加以調整修改就可以改成一次跑一個資料夾下的所有 CSV 檔。 23 | 24 | ```r 25 | > data <- readLines("Desktop/A_lvr_land_A.CSV", encoding="big5") # 讀取實價登入資料,是一行一行讀取進來。 26 | > data <- iconv(data, "big5", "utf8") 將資料轉成 UTF-8。 27 | 28 | > column_count <- length(strsplit(data[1], ",")[[1]]) 29 | row_count <- length(data) # 計算 column 與 count 個數。 30 | 31 | > fix_data <- matrix(NA, nrow = row_count, ncol = column_count) # 建立一個空的 NA 矩陣,維度來自於 row_count 與 column_count。 32 | 33 | > for(row in 1:row_count) { 34 | + for(col in 1:column_count) { 35 | + fix_data[row,col] <- strsplit(data[row], ",")[[1]][col] # 執行 for loop 將資料塞入 fix_data。 36 | + } 37 | + } 38 | 39 | > write.table(fix_data[2:row_count,], file = "fix_A_lvr_land_A.CSV", sep = ",", col.names = fix_data[1,]) # 將資料輸出,輸出注意一點,因為第一 row 是欄位名稱,所以記得指標要從 2 開始,指標 1 的部分要放到 col.names。 40 | ``` 41 | ### 讀取 XML 檔案。 42 | 43 | 這邊順便也介紹讀取 XML 方法,是因為讀取 XML 檔案比較不會發生上述的編碼問題,所以如果兩者都會的話,以後有提供 CSV 與 XML 檔案時,就可以選 XML 檔案以免製造自己的麻煩。 44 | 45 | 46 | ```r 47 | > library(XML) # 要先安裝 XML package 再載入。 48 | > data <- xmlToDataFrame("Desktop/A_lvr_land_A.XML") 49 | ``` 50 | 51 | ### 匯入 RDA 檔案 52 | 53 | 匯入 RDA 檔案有以下兩種方式。 54 | 55 | + 在工作目錄直接點選 RDA 檔案,選擇匯入即可。 56 | + 在 console 下 load(檔案名稱)。 57 | -------------------------------------------------------------------------------- /arrange_data/merge_and_subsetting.md: -------------------------------------------------------------------------------- 1 | # 資料合併與分割 2 | 3 | 資料整理最後來介紹如何合併與分割資料。 4 | 5 | + union、cbind 與 rbind 函數 6 | + merge 函數 7 | + split 函數 8 | + subset 函數 9 | 10 | ### 資料合併 11 | 12 | ```r 13 | > x <- c(1, 2, 3) 14 | > y <- c(10, 20, 30) 15 | > union(x ,y) # union 如英文名稱就是取聯集。 16 | [1] 1 2 3 10 20 30 17 | 18 | > rbind(x, y) # 透過 row 合併。 19 | [,1] [,2] [,3] 20 | x 1 2 3 21 | y 10 20 30 22 | 23 | > cbind(x, y) # 透過 column 合併。 24 | x y 25 | [1,] 1 10 26 | [2,] 2 20 27 | [3,] 3 30 28 | 29 | > x <- cbind(c("Tom", "Joe", "Vicky"), c(27, 29, 28)) 30 | > y <- cbind(c("Tom", "Joe", "Vicky"), c(178, 186, 168)) 31 | > colnames(x) <- c("name", "age") 32 | > colnames(y) <- c("name", "tall") 33 | 34 | > merge(x, y, by = "name") # 將 data.frame 透過一個欄位進行合併。 35 | name age tall 36 | 1 Joe 29 186 37 | 2 Tom 27 178 38 | 3 Vicky 28 168 39 | 40 | > x <- cbind(c("Tom", "Joe", "Vicky", "Bob"), c(27, 29, 28, 25)) 41 | > y <- cbind(c("Tom", "Joe", "Vicky", "Bruce"), c(178, 186, 168, 170)) 42 | > colnames(x) <- c("name", "age") 43 | > colnames(y) <- c("name", "tall") 44 | 45 | > merge(x, y, by = "name", all = T) # alt 是用來詢問是否顯示所有資料,像 Bob 與 Bruce 都有一欄資料沒有,所以沒下 all = T,應該不會出現 Bob 與 Bruce 資料。 46 | name age tall 47 | 1 Bob 25 48 | 2 Joe 29 186 49 | 3 Tom 27 178 50 | 4 Vicky 28 168 51 | 5 Bruce 170 52 | 53 | > merge(x, y, by = "name", all.x = T) # 只顯示 x 有的資料,所以 Bruce 就不會出現。 54 | name age tall 55 | 1 Bob 25 56 | 2 Joe 29 186 57 | 3 Tom 27 178 58 | 4 Vicky 28 168 59 | 60 | > merge(x, y, by = "name", all.y = T) # 只顯示 y 有的資料,所以 Bob 就不會出現。 61 | name age tall 62 | 1 Joe 29 186 63 | 2 Tom 27 178 64 | 3 Vicky 28 168 65 | 4 Bruce 170 66 | ``` 67 | 68 | ### 資料分割 69 | 70 | ```r 71 | > data <- iris 72 | > split(data, sample(rep(1:2, 75))) # rep(1:2, 75) 產生 1,2 交錯的向量,但加了前面的 sample 則是隨機抽取,所以向量 1,2 會被打亂,split 會依照 sample(rep(1:2, 75)) 分組,都是 1 的會在同一組,都是 2 的也會在同一組。 73 | 74 | > data <- iris 75 | 76 | > subset(data, Sepal.Length > 5) # 只會出現 Sepal.Length > 5 的資料 77 | 78 | > subset(data, Sepal.Length > 5,select = Sepal.Length) # 只會出現 Sepal.Length > 5 的資料且欄位只有 Sepal.Length,select 代表會出現的欄位。 79 | 80 | > subset(data, Sepal.Length > 5,select = -Sepal.Length) # selct = 負的代表不要出現的欄位。 81 | ``` 82 | -------------------------------------------------------------------------------- /environment_settings/RStudio_introduction.md: -------------------------------------------------------------------------------- 1 | # Rstudio 基本介紹 2 | 3 | ### 簡介 4 | RStudio 是一個 [IDE](http://zh.wikipedia.org/wiki/集成开发环境),在作者剛開始學 R 的時候,其實並沒有 RStudio 只有 R 的 GUI 畫面,後來為了提高開發效率,這套工具才就此誕生。Rstudio 特點很多就不再一一贅述,用過了以後就會覺得哪裡好用了,尤其是針對以前用過 GUI 的人更是一大福音。 5 | 6 | ### 介面概況 7 | 8 | ![RStudio](../image/environment_settings/download-9.png) 9 | 10 | + Workspace (左上角) 11 | + Console (左下角) 12 | + Environment、History (右上角) 13 | + Files、Plots、Packages、Help、Viewer (右上角) 14 | 15 | ### Workspace 16 | 剛開啟時不會存在,可以在左上角有一個開啟新文件的 icon,選擇一個新的 R script 檔案,這邊主要是用來撰寫程式碼的部份。 17 | 18 | ### Console 19 | 用來執行程式碼的地方,在 Workspace 選取欲執行的程式碼,按下以下快捷鍵就會發現程式碼自動在 Console 執行完成。 20 | 21 | |快捷鍵| Mac | Windows & Linux | 22 | | ------------ || ------------ | ------------- | 23 | |Run current line/selection| Command + Enter | Ctrl + Enter | 24 | 25 | ### Environment、History 26 | + Environment:是用來記載目前變數的數值,方便查看目前變數的狀況。 27 | + History:是所有在 Consloe 執行過程式碼的歷史記錄。 28 | 29 | ### Files、Plots、Packages、Help、Viewer 30 | + Files:是讓使用者了解所在的工作環境是在哪個目錄,這個對讀取檔案非常重要。 31 | + Plots:顯示使用者畫好的圖表。 32 | + Package:記錄目前已安裝的 Package,打勾代表已經載入,安裝 Package 請點選「Install」。 33 | + Help:查詢文件使用,在 Console 輸入 help(),() 輸入所要查詢方法的名稱,ex:help(sum)。 34 | + Viewer:是用來顯示網頁或 html file。 35 | 36 | ### 快捷鍵 37 | 請參考 [RStudio](https://support.rstudio.com/hc/en-us/articles/200711853-Keyboard-Shortcuts) 官方文件 38 | 39 | ### 調整 RStudio 的 Appearance 與 Pane layout。 40 | 點選右上角的 RStudio > Preferences 裡面的 Appearance 與 Pane Layout。 41 | + Appearance:可以調整字體、字體大小、Workspace 與 Console 的 theme。 42 | + Pane Layout:調整開啟畫面的左上、左下、右上、右下的內容,可以自動調整。 43 | 44 | ### 實際操作 45 | 46 | 1. 開啟一個新的 R script 檔案 47 | 2. 輸入程式碼(程式碼如下) 48 | 3. 利用快捷鍵在 Console 執行 49 | 4. 在 Environment 會發現 x、y 與 z 的值。 50 | 51 | ```r 52 | x <- 3 53 | y <- 4 54 | z <- sum(x + y) 55 | help(sum) 56 | ``` 57 | 58 | 註:<- 是 R 的 assignment operator 用來賦與變數值所使用,像 x <- 3 代表 x 是 3,另外提醒一下,變數的大小寫是有差別的,代表兩個不同變數,ex:x 與 X 59 | 60 | ### 查詢函數的小技巧 61 | + 使用 help(函數名稱) 等同於 ?函數名稱 62 | + 使用 args(函數名稱) 得知函數參數有哪些 63 | + 使用 example(函數名稱),ex:example(dim) 取得函數的使用範例,但是切記不是所有方法都有 64 | + 在 Console 輸入函數名稱後,按下 tab 鍵可以看到函數相關資訊 65 | 66 | ### 推薦查詢文件小工具 67 | 68 | + [Dash](http://kapeli.com/dash):針對 Mac 使用者。 69 | + [Velocity](http://velocity.silverlakesoftware.com):針對 Windows 使用者,聽說背後的文件來源是來自 Dash。 70 | 71 | 以下是 Dash 的畫面。 72 | 73 | ![Dash - Home](../image/environment_settings/dash-1.png) 74 | 75 | ![Dash - Search](../image/environment_settings/dash-2.png) 76 | -------------------------------------------------------------------------------- /variable_and_data/matrix.md: -------------------------------------------------------------------------------- 1 | # 矩陣 2 | 3 | ### 利用 matrix 建立矩陣 4 | 5 | 當陣列是 2 維的狀況就是所謂的矩陣,可以利用 matix 產生矩陣,也可以用之前產生陣列的方法實作。 6 | 7 | ```r 8 | > matrix(c(1:4), nrow = 2, ncol = 2) # 預設是按照 column 填入資料 9 | [,1] [,2] 10 | [1,] 1 3 11 | [2,] 2 4 12 | 13 | > matrix(c(1:4), nrow = 2, ncol = 2, byrow = TRUE) # 可以更改成按照 row 填入資料 14 | [,1] [,2] 15 | [1,] 1 2 16 | [2,] 3 4 17 | ``` 18 | 19 | ### 透過指標提取資料 20 | 矩陣跟陣列一樣,還是可以透過指標選取矩陣的部份元素。 21 | 22 | ```r 23 | > x <- c(1, 2, 3) 24 | > y <- c(4, 5, 6) 25 | 26 | > z = rbind(x, y) 27 | > z 28 | [,1] [,2] [,3] 29 | x 1 2 3 30 | y 4 5 6 31 | 32 | > z[,1] # 選取第一行(column、直) 33 | x y 34 | 1 4 35 | 36 | > z[1,] # 選取第一列(row、橫) 37 | [1] 1 2 3 38 | 39 | > z[1,1:2] # 選取第一列第一到二行 40 | [1] 1 2 41 | ``` 42 | 43 | ### 基本相關函數 44 | 45 | + t(x):將矩陣轉置。 46 | + %*%:矩陣相乘。 47 | + diag:產生一個對角矩陣,或回傳矩陣的對角線向量 48 | + det:計算矩陣行列式值,一定是要對稱矩陣。 49 | + solve:傳回矩陣的反矩陣,非常適合解線性方程式。 50 | + eigen:計算矩陣的特徵向量與特徵值。 51 | + rownames:修改或查詢 row 名稱。 52 | + colnames:修改或查詢 column 名稱。 53 | 54 | ```r 55 | > x <- c(1, 2, 3) 56 | > y <- c(4, 5, 6) 57 | 58 | > z <- rbind(x, y) 59 | [,1] [,2] [,3] 60 | x 1 2 3 61 | y 4 5 6 62 | 63 | > t(z) 64 | x y 65 | [1,] 1 4 66 | [2,] 2 5 67 | [3,] 3 6 68 | 69 | > z %*% z # 矩陣相乘要符合前者 column 維度 = 後者 row 維度,如果沒有會發生錯誤! 70 | 錯誤在z %*% z : 非調和引數 71 | > v <- z %*% t(z) 72 | x y 73 | x 14 32 74 | y 32 77 75 | 76 | 77 | > w <- diag(c(1,2,3)) # 傳入向量回傳一個對角矩陣 78 | [,1] [,2] [,3] 79 | [1,] 1 0 0 80 | [2,] 0 2 0 81 | [3,] 0 0 3 82 | 83 | > diag(w) # 傳入矩陣回傳矩陣對角線向量 84 | [1] 1 2 3 85 | 86 | > det(v) #一定要對稱矩陣才可以計算。 87 | [1] 54 88 | 89 | > solve(v) 90 | x y 91 | x 1.4259259 -0.5925926 92 | y -0.5925926 0.2592593 93 | 94 | > b = c(1,1) 解 Ax = b,求出 x 向量 A:變數 v,b:變數 b 95 | > solve(v,b) 96 | x y 97 | 0.8333333 -0.3333333 98 | 99 | > u = matrix(1:9, nrow = 3, ncol = 3) 100 | > u 101 | [,1] [,2] [,3] 102 | [1,] 1 4 7 103 | [2,] 2 5 8 104 | [3,] 3 6 9 105 | > eigen(u) # 特徵值 106 | $values 107 | [1] 1.611684e+01 -1.116844e+00 -5.700691e-16 108 | 109 | $vectors # 特徵向量 110 | [,1] [,2] [,3] 111 | [1,] -0.4645473 -0.8829060 0.4082483 112 | [2,] -0.5707955 -0.2395204 -0.8164966 113 | [3,] -0.6770438 0.4038651 0.4082483 114 | 115 | > rownames(z) # 還沒修改的時候,是 x 與 y,因為當初是利用兩個向量,利用 rbind 組成,所以會利用向量的變數稱名當作 row 名稱。 116 | [1] "x" "y" 117 | > rownames(z) <- c("第一行", "第二行") 118 | > rownames(z) 119 | [1] "第一行" "第二行" 120 | 121 | > colnames(z) 122 | NULL 123 | > colnames(z) <- c("第一列", "第二列", "第三列") 124 | > colnames(z) 125 | [1] "第一列" "第二列" "第三列" 126 | 127 | > z 128 | 第一列 第二列 第三列 129 | 第一行 1 2 3 130 | 第二行 4 5 6 131 | ``` 132 | -------------------------------------------------------------------------------- /variable_and_data/vector.md: -------------------------------------------------------------------------------- 1 | # 向量 2 | 3 | ### 利用 c(...) 建立向量,但切記向量元素必須是同個資料屬性。 4 | 5 | ```r 6 | > c(1, 2, 3) 7 | [1] 1 2 3 8 | 9 | > c(1, TRUE, "test") # 全部都變成 character 10 | [1] "1" "TRUE" "test" 11 | 12 | > c(1.1, TRUE, "test") # 全部都變成 character 13 | [1] "1.1" "TRUE" "test" 14 | 15 | > c(1+2i, TRUE, "test") # 全部都變成 character 16 | [1] "1+2i" "TRUE" "test" 17 | 18 | > c(1, TRUE) # 全部自動轉成 integer 19 | [1] 1 1 20 | 21 | > c(1.1, TRUE) # 全部自動轉成 numeric 22 | [1] 1.1 1.0 23 | 24 | > c(1+2i, TRUE) # 全部自動轉成 complex 25 | [1] 1+2i 1+0i 26 | 27 | > c(1, 1.1) # 全部自動轉成 numeric 28 | [1] 1.0 1.1 29 | 30 | > c(1, 1.1, 1+2i) # 全部自動轉成 complex 31 | [1] 1.0+0i 1.1+0i 1.0+2i 32 | ``` 33 | 註:經由以上比較後,可以得到當放入的形態不同時,會被轉成同一形態,且可以每個形態的強弱不同,以下是強到弱排序。 34 | 35 | character > complex > numeric > integer > logical 36 | 37 | ### 透過指標與名稱提取資料 38 | 我們可以透過以下二種方式取得向量元素。 39 | 40 | + 指標 41 | + 元素名稱 42 | 43 | 另外可以搭配 [] 或 [[]],這樣分別會回傳向量元素的所有資訊或向量元素的數值,總共可以分成以下四種狀況。 44 | 45 | + x[i]:回傳向量元素所有資訊 46 | + x[[i]]:只回傳向量元素的值 47 | + x[元素名稱]:回傳向量元素所有資訊 48 | + x[[元素名稱]]:只回傳向量元素的值 49 | 50 | ```r 51 | > x <- c(joe=12, vicky=14, bob=17) 52 | 53 | > x[1] 54 | joe 55 | 12 56 | > x[[1]] 57 | [1] 12 58 | 59 | > x["joe"] 60 | joe 61 | 12 62 | > x[["joe"]] 63 | [1] 12 64 | 65 | > x[1:2] # 一次取多個向量元素 66 | joe vicky 67 | 12 14 68 | ``` 69 | 70 | 71 | ### c(...) 類似的函數 x:y、seq 與 rep 72 | 73 | + x:y:回傳 x 到 y 的整數向量,所以 x 與 y 都是整數。 74 | + seq(s, e, by):產生一個等差級數的向量。 75 | + s 是初始值 76 | + e 是結束值 77 | + by 是遞增值,預設是 1 78 | + rep(x, times, each):產生一個重覆循環的向量。 79 | + x 是需重覆循環的數值 80 | + times 是重覆循環次數 81 | + each 是 x 內元素重覆的次數 82 | 83 | ```r 84 | > 1:5 85 | [1] 1 2 3 4 5 86 | 87 | > seq(1, 5) 88 | [1] 1 2 3 4 5 89 | 90 | > seq(1, 5, 0.3) # 就算沒有剛好加到跟結束值一樣也沒關係 91 | [1] 1.0 1.3 1.6 1.9 2.2 2.5 2.8 3.1 3.4 3.7 4.0 4.3 4.6 4.9 92 | 93 | > rep(c(1, 2, 3), times = 3, each = 2) 94 | [1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3 95 | 96 | > rep(1:4, times = 3, each = 2) 97 | [1] 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 98 | ``` 99 | ### 基本相關函數 100 | 101 | + 向量加減乘除 102 | + length:計算向量中的元素個數。 103 | + sum:將向量所有元素加總。 104 | + prod:將向量所有元素相乘。 105 | + cumsum:回傳元素累加向量。 106 | + cumprod:回傳元素累乘向量。 107 | + sort:將向量元素排列,產生排序過的向量。 108 | + rank:回傳各向量元素的排序值。 109 | 110 | ```r 111 | > c(3, 4, 2) + c(3, 4, 2) 112 | [1] 6 8 4 113 | > c(3, 4, 2) - c(3, 4, 2) 114 | [1] 0 0 0 115 | > c(3, 4, 2) * c(3, 4, 2) 116 | [1] 9 16 4 117 | > c(3, 4, 2) / c(3, 4, 2) 118 | [1] 1 1 1 119 | 120 | > length(c(3, 4, 2)) 121 | [1] 3 122 | 123 | > sum(c(3, 4, 2)) 124 | [1] 9 125 | 126 | > cumsum(c(3, 4, 2)) 127 | [1] 3 7 9 128 | 129 | > cumprod(c(3, 4, 2)) 130 | [1] 3 12 24 131 | 132 | > prod(c(3, 4, 2)) 133 | [1] 24 134 | 135 | > sort(c(3, 4, 2)) 136 | [1] 2 3 4 137 | 138 | > rank(c(3, 4, 2)) 139 | [1] 2 3 1 140 | ``` 141 | 142 | 上述向量加減乘除時,向量個數都是一樣的狀況,但不同的狀況會發生什麼結果,請看以下測試。 143 | 144 | ### 加跟減 145 | 146 | 如果長度較長的向量長度是較短的倍數的話是可以相加或相減的。 147 | 148 | ```r 149 | > c(1, 2) + c(1, 2, 3) 150 | [1] 2 4 4 151 | 警告訊息: 152 | In c(1, 2) + c(1, 2, 3) : 較長的物件長度並非較短物件長度的倍數 153 | 154 | > c(1, 2) + c(1, 2, 3, 4) # 1+1 2+2 1+3 2+4 155 | [1] 2 4 4 6 156 | ``` 157 | 158 | 159 | ### 乘跟除 160 | 161 | 乘跟除的情況與加跟減狀況一致,只是當長度不是倍數時會有結果但也會警告。 162 | 163 | ```r 164 | > c(1, 2) * c(1, 2, 3) # 1*1 2*2 1*3 165 | [1] 1 4 3 166 | 警告訊息: 167 | In c(1, 2) * c(1, 2, 3) : 較長的物件長度並非較短物件長度的倍數 168 | 169 | > c(1, 2) * c(1, 2, 3, 4) # 1*1 2*2 1*3 2*4 170 | [1] 1 4 3 8 171 | ``` 172 | 173 | 174 | --------------------------------------------------------------------------------