R語言,一種自由軟件編程語言與操作環境,主要用於統計分析、繪圖、數據挖掘。R本來是由來自新西蘭奧克蘭大學的Ross Ihaka和Robert Gentleman開發(也因此稱為R),現在由“R開發核心團隊”負責開發。R是基於S語言的一個GNU計划項目,所以也可以當作S語言的一種實現,通常用S語言編寫的代碼都可以不作修改的在R環境下運行。R的語法是來自Scheme。
R的源代碼可自由下載使用,亦有已編譯的可執行文件版本可以下載,可在多種平台下運行,包括UNIX(也包括FreeBSD和Linux)、Windows和MacOS。R主要是以命令行操作,同時有人開發了幾種圖形用戶界面。
R內置多種統計學及數字分析功能。R的功能也可以通過安裝包(Packages,用戶撰寫的功能)增強。因為S的血緣,R比其他統計學或數學專用的編程語言有更強的面向對象(面向對象程序設計)功能。
R的另一強項是繪圖功能,制圖具有印刷的素質,也可加入數學符號。
雖然R主要用於統計分析或者開發統計相關的軟件,但也有人用作矩陣計算。其分析速度可媲美專用於矩陣計算的自由軟件GNU Octave和商業軟件MATLAB。
可以在R-project的官網http://www.r-project.org/獲取R的安裝包
另外,建議安裝一個R集成開發環境比如Rstudio,可以在https://www.rstudio.com/獲取
R語言中的基本對象
R語言中的基本對象有:向量、矩陣、數組、數據框、列表等等。
1.R語言的向量對象
向量是用於存儲數值型、字符型或邏輯型數據的一維數組。
R語言中建立一個向量的函數是c(),
例如:
c(1,2,3,4),結果是[1] 1 2 3 4
此外,也可以用c()函數建立字符向量,
例如:
c("hello", "world!"),結果是[1] "hello" "world!"
如果傳遞給c()的參數既有數值又有字符串,則c()會默認將數值轉化成字符串,例如:c(1.5, 'a'),結果是[1] "1.5" "a"
使用str()函數察看結果的類型,也表明結果是字符串類型的向量:
> str(c(1.5,'a'))
chr [1:2] "1.5" "a"
由此我們可以知道:同一個向量中無法混雜不同格式的數據。
tip:建議不要使用R的內置函數名,如c作為變量,以避免混淆
除了c函數,我們也可以使用冒號:創建一個規則的向量,
比如:
#創建1:6的向量,增量為1
> 1:6
[1] 1 2 3 4 5 6
> 6:1
[1] 6 5 4 3 2 1
R語言中,可以用等號或者箭頭給變量賦值:
> a=c(1,2,3)
> a
[1] 1 2 3
> b<-c(1,2,3)
> b
[1] 1 2 3
也可以
> c(1,2,3)->b
> b
[1] 1 2 3
tip:rstudio中可以用快捷鍵alt+- 鍵入箭頭符號
注意:R允許使用=為對象賦值。但是這樣寫的R程序並不多,因為它不是標准語法,某些情況下,用等號賦值會出現問題,R程序員可能會因此取笑你。你還可以反轉賦值方向。例如,rnorm(5) -> x與上面的語句等價。
向量的四則運算
向量之間可以直接進行加減乘除運算:
如:
> c(1,2,3,4)+c(5,6,7,8)
[1] 6 8 10 12
> c(1,2,3,4)-c(5,6,7,8)
[1] -4 -4 -4 -4
> c(1,2,3,4)*c(5,6,7,8) [1] 5 12 21 32
如果是兩個長度不同的向量相加,則會將短的向量重復若干次,比如下面這個例子中,后一個向量重復了一次:
> c(1,2,3,4)+c(5,6)
[1] 6 8 8 10
進行不同長度向量加/減法,最好長向量的長度必須是短向量長度的整數倍,否則會出現警告:
> c(1,2,3,4)+c(5,6,7)
[1] 6 8 10 9
警告信息:
In c(1, 2, 3, 4) + c(5, 6, 7) : 長的對象長度不是短的對象長度的整倍數
向量的比較
除了四則運算外,我們還可以比較兩個向量的大小,產生的結果是個邏輯向量:
> c(2,3,4,5)>c(1,4,5,3)
[1] TRUE FALSE FALSE TRUE
向量元素的訪問
R語言中采用方括號中的數字來訪問向量中一個特定位置的元素。值得注意的是,R語言與傳統編程語言如C、Java不同,其數組元素是從位置1開始的。
> a <- c(1,2,3,4) > a[1] [1] 1
當然,如果我們不需要某個元素還可以這樣:
> a[-2] [1] 1 3 4
第二個元素就被丟掉了,如果想丟掉多個,可以這樣:
> a[c(-1,-3)] [1] 2 4
這樣,第一個和第三個元素都被丟掉了。
2.R語言的矩陣對象
矩陣是一個二維數組,每個元素都擁有相同數據類型。R中使用matrix函數創建一個矩陣
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
參數中,data是矩陣的元素,nrow是行數,ncol是列數,byrow指定按行填充(TRUE)還是按列填充(FALSE),默認按列填充,dimnames指定每一維的名字。
例1:
> m1 <- matrix(1:20,nrow=5,ncol=4) #創建5x4的矩陣,按列填充
> m1
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
例2:
> cell <- c(1,2,3,4)
> rnames <- c("R1", "R2") #行名為"R1", "R2"
> cnames <- c("C1", "C2") #列名為"C1", "C2"
> m2 <- matrix(cell, nrow=2, ncol=2, byrow=TRUE, dimnames=list(rnames, cnames)) #2x2,按行填充
> m2
C1 C2
R1 1 2
R2 3 4
R語言中可以使用方括號+下標來選擇矩陣中的行、列或元素。
如:
> m1[1,] #m1矩陣的第一行
[1] 1 6 11 16
> m1[,1] #m1矩陣的第一列
[1] 1 2 3 4 5
這樣做返回的結果是一個向量,有時我們不想丟掉矩陣的格式,那么我們可以加上drop=F選項來保持返回結果的格式:
> m1[,1,drop=F] [,1] [1,] 1 [2,] 2 [3,] 3 [4,] 4 [5,] 5
> m1[3,4] #m1第3行,第4列元素
[1] 18
當然,也可以同時選擇多行或者多列
> m1[,c(2,3)] #同時選擇第2列和第3列
[,1] [,2]
[1,] 6 11
[2,] 7 12
[3,] 8 13
[4,] 9 14
[5,] 10 15
使用dim函數可以很方便地查詢矩陣的維度:
> dim(m1) [1] 5 4
3.R語言的數組對象
數組與矩陣類似,但是維度可以大於2。數組由array()函數創建,形式如下:
array(data = NA, dim = length(data), dimnames = NULL)
其中data包含了數組中的數據,dim是一個數值型向量,給出各個維度下標的最大值,而dimnames是可選的、各個維度名稱的標簽的列表。
例子:
> dim1 <- c("A1", "A2")
> dim2 <- c("B1", "B2", "B3")
> dim3 <- c("C1", "C2", "C3", "C4")
> z <- array(1:24, c(2,3,4), dimnames=list(dim1,dim2,dim3))
> z
, , C1
B1 B2 B3
A1 1 3 5
A2 2 4 6
, , C2
B1 B2 B3
A1 7 9 11
A2 8 10 12
, , C3
B1 B2 B3
A1 13 15 17
A2 14 16 18
, , C4
B1 B2 B3
A1 19 21 23
A2 20 22 24
> z[1,2,3] #A1,B2,C3
[1] 15
4.R語言的數據框對象
數據框中不同的列可以包含不同模式的數據,較矩陣來說更為一般。它與SAS,SPSS和Stata中看到的數據集類似。數據框是R中最常處理的數據結構。數據框可以用data.frame()創建:
mydata<-data.frame(col1, col2, ...)
其中的列向量col1,2,...可以為任何類型。每一列的名稱可由函數names指定。
例:
> patientID <- c(1,2,3,4)
> age <- c(25,34,28,52)
> diabetes <- c("Type1", "Type2", "Type1", "Type1")
> status <- c("Poor", "Improved", "Excellent", "Poor")
> patientData <- data.frame(patientID, age, diabetes, status)
> patientData
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
4 4 52 Type1 Poor
- 選取數據框中的數據
> patientData[1:2] #選擇數據框的前2列
patientID age
1 1 25
2 2 34
3 3 28
4 4 52
也可以用變量名來選擇數據,如:
> patientData[c("diabetes", "status")]
diabetes status
1 Type1 Poor
2 Type2 Improved
3 Type1 Excellent
4 Type1 Poor
此外,還可以用記號$來選擇數據框中的特定變量,例如你想知道糖尿病類型變量diabetes和病情變量status的列聯表,可以使用以下代碼:
> table(patientData$diabetes,
patientData$status)
Excellent Improved Poor
Type1 1 0 2
Type2 0 1 0
每次引用變量名都必須鍵入一次patientData顯得很麻煩,可以使用函數attach()和detach()或單獨使用函數with()來簡化代碼。
函數attach()可以將數據框添加到R的搜索路徑中,R在遇到一個變量名后,將檢查搜索路徑中的數據框。
使用attach函數將數據框patientData加入搜索路徑:
> attach(patientData)
The following object(s) are masked _by_ '.GlobalEnv':
age, diabetes, patientID, status
接着就可以直接引用patientData的變量了:
> age
[1] 25 34 28 52
> diabetes
[1] "Type1" "Type2" "Type1" "Type1"
> patientID
[1] 1 2 3 4
> status
[1] "Poor" "Improved" "Excellent" "Poor"
注意:當我們環境中已經有與數據框中某個變量同名的變量時,原始變量將取得優先權。任何情況下都要當心那些告知某個對象已被屏蔽的警告。
5.R語言中的列表對象
列表是R的數據類型中最為復雜的一種,它是一些對象的有序集合。可以使用list()創建列表:
mylist <- list(object1, object2,...)
其中的對象可以是上面提到的任何結構。還可以為列表中的對象命名:
mylist <- list(name1=object1, name2=object2,...)
例:
> g <- "my first list"
> h <- c(25,26,15,39)
> j <- matrix(1:10, nrow=5)
> k <- c("one", "two", "three")
> mylist <- list(title=g, ages=h, j, k)
> mylist
$title
[1] "my first list"
$ages
[1] 25 26 15 39
[[3]]
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
[[4]]
[1] "one" "two" "three"
> mylist[[2]] #輸出第二個成分
[1] 25 26 15 39
或:
> mylist[["ages"]]
[1] 25 26 15 39
由於兩個原因,列表成為R中的重要數據結構。首先,列表允許以一種簡單的方式組織和重新調用不相干的信息。其次,許多R函數的運行結果都是以列表的形式返回的。需要取出其中哪些成分由分析人員決定。
tip:R不提供多行注釋或塊注釋的功能。你必須以#作為多行注釋每行的開始。處於調試目的,你也可以把想讓解釋器忽略的代碼放到語句if(FALSE){...}中。將FALSE改為TRUE即允許這快代碼運行。
其他的一些注意事項:
- 對象名稱中的句點(.)沒有特殊意義。但美元符號($)卻有着其他語言中句點類似的含義,即指定一個對象中的某些部分。例如,A$x是指數據框A中的變量x
- 將一個值賦給某個向量、矩陣、數組或列表中一個不存在的元素時,R將自動擴展這個數據結構以容納新值。
比如:
> x <- c(1,2,3)
> x[8] <- 10
> x
[1] 1 2 3 NA NA NA NA 10
- R中沒有標量。標量以單元素向量的形式出現
- R中的下標不以0開始,而從1開始。
- 變量無法被聲明。它們在首次賦值時生成。
