1 R語言101

本章節介紹學習R語言的基本知識,包括基本指令操作、運算子介紹等。

1.1 什麼是R語言

R語言是一種自由軟體程式語言,主要用於資料分析與統計運算,2000年時終於發表R 1.0.0,有關R語言的發展歷史可參考維基百科。基本的R軟體已經內建多種統計及分析功能,其餘功能可以透過安裝套件(Packages)加載,眾多的套件使R的使用者可以【站在巨人的肩膀上(Standing on the shoulders of giants (Hal R. Varian, Google))】做資料分析,截至2017年1月為止,R軟體可另外安裝的套件數目共有10,000個以上 (R Studio報導)。常用的套件清單可參考各項網路資訊,如R Studio的整理:Quick list of useful R packages

安裝套件Package的方法如下:

值得注意的是,套件名稱需要加上雙引號,舉例來說,若要安裝ggplot2套件,則要在R的Console視窗內輸入:

若要載入已安裝的套件,則輸入library(套件名稱),範例:

載入已安裝的套件時,可以不用在套件名稱前後加雙引號,但也可以加 (參考資料)。

1.2 函數使用

在R中有許多內建函數,安裝套件後各套件也會提供各式各樣寫好的函數,函數使用方式為函數名稱(參數1,參數2,....),以計算平均數為例,可使用mean()函數,範例如下:

## [1] 3.5

若想知道各函數所需參數,可使用?函數名稱觀看函數作者所撰寫的說明文件

除非有指定參數名稱,函數的參數設定有順序性,如序列產生函數seq(),參數順序為from, to, by,代表序列起點、序列終點,以及相隔單位。

## [1] 1 3 5 7 9
## [1] 1 3 5 7 9
## [1] 1 3 5 7 9

1.3 變數設定

在開始深入學習R語言之前,首要任務是學習最基本的R程式碼:變數設定,在R語言中,主要使用<-設定變數,設定方法為:變數名稱<-變數內容(值),雖然變數名稱可依箭頭方向放置於左側<-或右側->,但為方便閱讀,變數名稱多放置於左側。

## [1] 1
## [1] 2

R語言也接受使用=設定變數,此時變數名稱必須在左側,如:變數名稱=變數內容

## [1] 1

除了變數設定外,str()函數也為常用基本函數,str()用在檢查與總覽各類變數型態。

##  num 3

變數的命名有以下規則:

  • 不可使用保留字,如break, else, FALSE, for, function, if, Inf, NA, NaN, next, repeat, return, TRUE, while等
  • 開頭只能是英文字,或 .
  • 大小寫敏感

1.4 執行視窗

R是可直譯的語言,也就是說,可以在執行視窗(Console)直接打程式碼,在視窗出現>時,表示可輸入指令,若視窗出現+時,表示前面的程式碼還沒打完,必須鍵入完整的程式碼讓R執行。

1.5 資料型態

在R語言中,常用的資料型態包括數值 (numeric)字串 (character)布林變數 (logic)以及日期 (Date)等。

1.5.1 數值 numeric

數值包括整數(沒有小數點)與浮點數(有小數點)的數值

值得注意的是,若數值長度超過 2^53,必須導入bit64 package (Oehlschlagel 2020),將數值長度上限提高為2^63,才能表示完整數值

## [1] 9007199254740992
## [1] 9007199254740992
## integer64
## [1] 9007199254740992
## integer64
## [1] 9007199254740993

1.5.2 字串 character

用雙引號"框起的文字會被儲存為字串格式,若在數字前後加上雙引號,數字也會被儲存為文字形式,無法進行數值的加減乘除等運算。

1.5.3 布林變數 logic

用於邏輯判斷,可使用大寫TRUET代表,大寫FALSEF代表假。

1.5.4 日期 (Date)

用於表示日期,於資料分析中常用,使用Sys.Date()指令可得系統日期。

## [1] "2020-07-20"

日期與字串的相關轉換操作可考慮使用簡單易懂的lubridate(Spinu, Grolemund, and Wickham 2020) package,如果想要將年/月/日格式的文字轉換為日期物件,可使用ymd()函數(y表年year,m表月month,d表日day),如果想要將月/日/年格式的文字轉換為日期物件,則使用mdy()函數,以此類推。

## [1] "2012-03-03"
## [1] "2012-03-03"

其他使用方式可參考 The Yhat Blog

1.6 基本運算子

1.6.1 數學基本運算

在R中,數學運算與其他程式語言相同

  • +
  • -
  • *
  • /
  • 餘數 %%
  • 次方 ^
## [1] 101
## [1] -99
## [1] 100
## [1] 0.01
## [1] 1
## [1] 8

###進階數學函數 - 四捨五入 round() - 無條件捨去 floor() - 無條件進位 ceiling()

## [1] 2.1
## [1] 1
## [1] 3

1.6.2 邏輯運算

常用之邏輯判斷也可在R中直接使用

  • 大於 >
  • 小於 <
  • 等於 ==,為了不與變數設定混淆,判斷兩變數是否相等,要用雙等號
  • 大於等於 >=
  • 小於等於 <=
## [1] FALSE
## [1] TRUE

文字字串也可比較大小

## [1] FALSE

邏輯混合判斷,和JAVA等語言不同的是,在R中使用單符號即可表示且&和或|

  • &
  • |
## [1] TRUE
## [1] FALSE
## [1] TRUE
## [1] TRUE

反向布林變數!

## [1] FALSE
## [1] TRUE

1.7 錯誤訊息

  • Message:有可能的錯誤通知,程式會繼續執行
  • Warning:有錯誤,但是不會影響太多,程式會繼續執行
  • Error:有錯,而且無法繼續執行程式
  • Condition:可能會發生的情況
## Warning in log(-1): 產生了 NaNs
## [1] NaN
## Error in mena(NA): 沒有這個函數 "mena"

錯誤訊息範例1:

# Error: could not find function "fetch_NBAPlayerStatistics"
# 找不到"fetch_NBAPlayerStatistics" function

可能原因:沒安裝或沒讀入SportsAnalytics package

錯誤訊息範例2:

# Error in library(knitr): there is no package called 'knitr'
# 找不到"knitr" package

可能原因:沒安裝knitr package

1.8 Help

R語言與套件均有完整的文件與範例可以參考,在R的執行視窗中,輸入?函數名稱?套件名稱即可看到函數或套件的使用說明

除此之外,Stack Overflow中也有許多問答,可直接在網站中搜尋關鍵字與錯誤訊息。

如果找不到解答,發問時請附上可以重現錯誤的程式碼資料,以及系統/套件的版本資訊,版本資訊可以透過執行下列程式碼取得:

## R version 4.0.1 (2020-06-06)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 18363)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=Chinese (Traditional)_Taiwan.950 
## [2] LC_CTYPE=Chinese (Traditional)_Taiwan.950   
## [3] LC_MONETARY=Chinese (Traditional)_Taiwan.950
## [4] LC_NUMERIC=C                                
## [5] LC_TIME=Chinese (Traditional)_Taiwan.950    
## 
## attached base packages:
## [1] grid      stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] tidyr_1.1.0           curl_4.3              treemap_2.4-2        
##  [4] purrr_0.3.4           caret_6.0-86          lattice_0.20-41      
##  [7] MASS_7.3-51.6         arulesViz_1.3-3       arules_1.6-6         
## [10] Matrix_1.2-18         fields_10.3           maps_3.3.0           
## [13] spam_2.5-1            dotCall64_1.0-0       rpart.plot_3.0.8     
## [16] rpart_4.1-15          googleVis_0.6.6       ggvis_0.4.5          
## [19] plotly_4.9.2.1        shiny_1.4.0.2         treemapify_2.5.3     
## [22] WDI_2.7.1             choroplethrMaps_1.0.1 choroplethr_3.6.3    
## [25] acs_2.1.4             ggmap_3.0.0.902       maptools_1.0-1       
## [28] rgeos_0.5-3           rgdal_1.5-12          sp_1.4-2             
## [31] rvest_0.3.5           xml2_1.3.2            Rfacebook_0.6.15     
## [34] httpuv_1.5.4          rjson_0.2.20          XML_3.99-0.3         
## [37] jsonlite_1.6.1        httr_1.4.1            readxl_1.3.1         
## [40] readr_1.3.1           SportsAnalytics_0.2   reshape2_1.4.4       
## [43] stringr_1.4.0         data.table_1.12.8     RCurl_1.98-1.2       
## [46] rmarkdown_2.3         knitr_1.28            bookdown_0.20        
## [49] bit64_0.9-7.1         bit_1.1-15.2          lubridate_1.7.9      
## [52] dplyr_1.0.0           ggplot2_3.3.1        
## 
## loaded via a namespace (and not attached):
##   [1] uuid_0.1-4           backports_1.1.7      Hmisc_4.4-0         
##   [4] igraph_1.2.5         plyr_1.8.6           lazyeval_0.2.2      
##   [7] splines_4.0.1        gridBase_0.4-7       digest_0.6.25       
##  [10] foreach_1.5.0        htmltools_0.4.0      viridis_0.5.1       
##  [13] gdata_2.18.0         magrittr_1.5         checkmate_2.0.0     
##  [16] cluster_2.1.0        gclus_1.3.2          recipes_0.1.12      
##  [19] ggfittext_0.9.0      gower_0.2.1          jpeg_0.1-8.1        
##  [22] colorspace_1.4-1     rappdirs_0.3.1       xfun_0.14           
##  [25] crayon_1.3.4         zoo_1.8-8            survival_3.1-12     
##  [28] tigris_1.0           iterators_1.0.12     glue_1.4.1          
##  [31] registry_0.5-1       gtable_0.3.0         ipred_0.9-9         
##  [34] scales_1.1.1         DBI_1.1.0            Rcpp_1.0.4.6        
##  [37] viridisLite_0.3.0    xtable_1.8-4         htmlTable_2.0.1     
##  [40] units_0.6-7          foreign_0.8-80       Formula_1.2-3       
##  [43] stats4_4.0.1         lava_1.6.7           prodlim_2019.11.13  
##  [46] DT_0.13              vcd_1.4-7            htmlwidgets_1.5.1   
##  [49] gplots_3.0.3         RColorBrewer_1.1-2   acepack_1.4.1       
##  [52] ellipsis_0.3.1       pkgconfig_2.0.3      nnet_7.3-14         
##  [55] RJSONIO_1.3-1.4      tidyselect_1.1.0     rlang_0.4.6         
##  [58] later_1.1.0.1        visNetwork_2.0.9     munsell_0.5.0       
##  [61] cellranger_1.1.0     tools_4.0.1          generics_0.0.2      
##  [64] evaluate_0.14        fastmap_1.0.1        yaml_2.2.1          
##  [67] ModelMetrics_1.2.2.2 caTools_1.18.0       RgoogleMaps_1.4.5.3 
##  [70] dendextend_1.13.4    packrat_0.5.0        nlme_3.1-148        
##  [73] mime_0.9             compiler_4.0.1       rstudioapi_0.11     
##  [76] png_0.1-7            e1071_1.7-3          tibble_3.0.1        
##  [79] stringi_1.4.6        highr_0.8            classInt_0.4-3      
##  [82] vctrs_0.3.1          pillar_1.4.4         lifecycle_0.2.0     
##  [85] lmtest_0.9-37        bitops_1.0-6         seriation_1.2-8     
##  [88] R6_2.4.1             latticeExtra_0.6-29  promises_1.1.1      
##  [91] TSP_1.1-10           KernSmooth_2.23-17   gridExtra_2.3       
##  [94] codetools_0.2-16     gtools_3.8.2         assertthat_0.2.1    
##  [97] withr_2.2.0          hms_0.5.3            timeDate_3043.102   
## [100] class_7.3-17         pROC_1.16.2          sf_0.9-5            
## [103] scatterplot3d_0.3-41 base64enc_0.1-3

References

Oehlschlagel, Jens. 2020. Bit64: A S3 Class for Vectors of 64bit Integers. https://CRAN.R-project.org/package=bit64.

Spinu, Vitalie, Garrett Grolemund, and Hadley Wickham. 2020. Lubridate: Make Dealing with Dates a Little Easier. https://CRAN.R-project.org/package=lubridate.