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的方法如下:

install.packages("套件名稱")

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

install.packages("ggplot2")

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

library(ggplot2)

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

1.2 函數使用

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

mean(c(1,2,3,4,5,6)) ##計算1~6的平均數
## [1] 3.5

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

?mean

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

seq(from=1,to=9,by=2)#1~9,每隔2產生一數字
## [1] 1 3 5 7 9
seq(1,9,2)#按照順序輸入參數,可省去參數名稱
## [1] 1 3 5 7 9
seq(by=2,to=9,from=1)#若不想照順序輸入參數,需要指定參數名稱
## [1] 1 3 5 7 9

1.3 變數設定

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

a<-1 
2->b
a
## [1] 1
b
## [1] 2

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

c=1 
c
## [1] 1

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

d<-3
str(d)
##  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

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

num1<-100 
num2<-1000.001

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

print(2^53, digits=20) 
## [1] 9007199254740992
print(2^53+1, digits=20) # +1後,數值仍與2^53相同
## [1] 9007199254740992
library(bit64) # 導入bit64 package
print(as.integer64(2)^53, digits=20)
## integer64
## [1] 9007199254740992
print(as.integer64(2)^53+1, digits=20)# 導入bit64後,可得正確答案
## integer64
## [1] 9007199254740993

1.5.2 字串 character

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

char1<-"abcTest" 
char2<-"100"
char3<-"200"
#char2+char3 #會輸出Error message: non-numeric argument to binary operator

1.5.3 布林變數 logic

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

boolT<-TRUE
boolT1<-T
boolF<-FALSE
boolF1<-F

1.5.4 日期 (Date)

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

dateBook<-Sys.Date()
dateBook
## [1] "2017-03-20"

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

library(lubridate)
ymd('2012/3/3')
## [1] "2012-03-03"
mdy('3/3/2012')
## [1] "2012-03-03"

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

1.6 基本運算子

1.6.1 數學基本運算

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

  • +
  • -
  • *
  • /
  • 餘數 %%
  • 次方 ^
num1<-1
num2<-100
num1+num2
## [1] 101
num1-num2
## [1] -99
num1*num2
## [1] 100
num1/num2
## [1] 0.01
100%%3 ##100除以3後所得餘數
## [1] 1
2^3 ##2的3次方
## [1] 8

1.6.2 進階數學函數

  • 四捨五入 round()
  • 無條件捨去 floor()
  • 無條件進位 ceiling()
num1<-1.568
num2<-2.121
round(num1,digits = 2) #四捨五入至小數點第二位
## [1] 1.6
round(num2,digits = 1) #四捨五入至小數點第一位
## [1] 2.1
floor(num1) ##1.568
## [1] 1
ceiling(num2) ##2.121
## [1] 3

1.6.3 邏輯運算

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

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

文字字串也可比較大小

char1<-"abcTest" 
char2<-"defTest"
char1>char2
## [1] FALSE

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

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

反向布林變數!

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

1.7 錯誤訊息

  • Message:有可能的錯誤通知,程式會繼續執行
  • Warning:有錯誤,但是不會影響太多,程式會繼續執行
  • Error:有錯,而且無法繼續執行程式
  • Condition:可能會發生的情況
log(-1)
## Warning in log(-1): NaNs produced
## [1] NaN
mena(NA)
## Error in eval(expr, envir, enclos): could not find function "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的執行視窗中,輸入?函數名稱?套件名稱即可看到函數或套件的使用說明

?ggplot2
?ymd

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

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

sessionInfo()
## R version 3.3.2 (2016-10-31)
## Platform: x86_64-apple-darwin13.4.0 (64-bit)
## Running under: macOS Sierra 10.12.3
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] lubridate_1.6.0 bit64_0.9-5     bit_1.1-12     
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.9     bookdown_0.3.9  digest_0.6.12   rprojroot_1.2  
##  [5] backports_1.0.5 magrittr_1.5    evaluate_0.10   highr_0.6      
##  [9] stringi_1.1.2   rstudioapi_0.6  rmarkdown_1.3   tools_3.3.2    
## [13] stringr_1.1.0   yaml_2.1.14     htmltools_0.3.5 knitr_1.15.1

References

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

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