R語言學習之基礎知識一
1. R物件
物件是R語言兩個主要概念之一,另一個是函式。
R物件可以看作是具有關聯名稱的儲存空間。R中的一切都儲存在物件中。所有的變數、資料、函式都以命名物件的形式儲存在計算機的記憶體中。
函式是R語言中一種特殊形式的物件,用來完成某個操作。函式可以接受一些輸入引數,通過執行一系列操作產生結果。R已提供大量可用函式,使用者也可以建立新的函式。
R語言中物件賦值運算子:<-,也可以是=,但為防止與相等測試混淆,不推薦用=。如給物件x賦值,R命令列直接命令:
>x <-945
這樣,就把數值945儲存在名為x的物件中。只要在R命令列中輸入物件的名詞,就能看到它的內容,如輸入:
>x
[1] 945
數值前的“[1]”可以讀作“此行是從物件的第一個元素開始顯示的值”。這種形式看起來很眼熟,就是C、JAVA等語言的陣列形式。確實R語言中的物件可以表示向量,內含多個值,用此種表示方式非常有用。
R語言的賦值操作也是“破壞性”的,即一個物件只能有一個給定的內容。如果將新的內容分配給當前物件,則該物件先前的內容會被覆蓋。舉例如下:
> y <-39
>y
[1] 39
> y <-67
>y
[1] 67
R語言賦值操作支援數值表示式,此種情況下,物件儲存表示式的計算結果:
> z <- 5
> w <-z^2
>w
[1] 25
>i<- (z* 2 + 45) / 2
>i
[1] 27.5
綜合上述賦值運算,R語言賦值運算子都先計算右側,然後把結果儲存到左側的物件中。
如果只想知道某些算數運算的結果,那麼不需要把表示式的結果賦給物件,即可將R環境當作計算器。本人在Ubuntu下經常這麼做,非常方便快捷。
> 34 + 90 /9
[1] 44
R可以將十六進位制數轉化為十進位制數。
> 0xf
[1] 15
> 0xff
[1] 255
> 0xffff
[1] 65535
值得注意的是:建立的每個物件都儲存在計算機記憶體中,直到刪除它。可通過命令ls()或objects()列舉出當前記憶體中的物件。
>ls()
[1]"i" "w" "x" "y" "z"
>objects()
[1]"i" "w" "x" "y" "z"
通過rm命令刪除物件,可以一次刪除一個,也可以一次刪除多個。
>rm(y)
>rm(x,z)
>ls()
[1]"i" "w"
刪除一個不存在的物件,系統會發出警告資訊。
>rm(y)
Warningmessage:
In rm(y) :object 'y' not found
R語言的物件名稱可以包含任何大、小寫字母、數字0~9(不能用於開頭)以及字母相似的符號“.”。注意:R中的名稱是區分大小寫的,這也是導致很多初學者遇到“找不到物件”錯誤的一個常見原因。
2. 向量
R中最基本的物件,有模式和長度兩種屬性。模式指的是儲存型別,長度是包含的元素數量。R的基本資料型別有:字元型、邏輯型、數值型、複數型。注意:R的字元型事實上是一組字元,而非單個字元,類似其它語言的字串型別。邏輯值只能是T(TRUE)和F(FALSE),True或False等不是有效的邏輯值,因為R中的名稱是大小寫敏感的。
即使將單一數字賦值給物件,也會建立一個包含單個元素的向量,這個從前面的示例中就可以看出。
R中使用c()函式和相應的引數來建立向量,length()檢視元素數量,mode()檢視資料型別。
> v <-c(4, 7, 23.5, 76.2, 80)
>v
[1] 4.0 7.0 23.5 76.2 80.0
>length(v)
[1] 5
>mode(v)
[1]"numeric"
一個向量所有元素必須屬於相同的模式,如果不是,會進行強制型別轉換。
> v <-c(4, 7, 23.5, 76.2, 80, "rrt")
> v
[1]"4" "7" "23.5" "76.2""80" "rrt"
所有向量可以包含缺失值NA。
> u <-c(4, 6, NA, 2)
>u
[1] 4 6NA 2
> k <-c(T, F, NA, TRUE)
> k
[1] TRUE FALSE NA TRUE
可通過方括號索引訪問向量中某個特定元素,也可以通過該方式改變某個特定元素值。
> v[2]
[1]"7"
> v[1]
[1]"4"
> v[1]<- "hello"
> v
[1]"hello" "7" "23.5" "76.2" "80" "rrt"
R允許建立空向量,且在不存在的索引處新增向量元素,可以改變向量長度。
> x <-vector()
>length(x)
[1] 0
>x[3] <-45
>length(x)
[1] 3
> x
[1] NA NA 45
注意:向量未知值的使用,雖然靈活,但卻是有代價的:在R中使用一個不存在的向量位置,不會報錯。如下示例:
>length(x)
[1] 3
> x[10]
[1] NA
> x[5]<- 4
> x
[1] NA NA 45NA 4
利用賦值運算的破壞性,可以縮短向量大小。
> v <-c(45, 243 , 78, 365, 5656, 334, 90, 23, 809)
> v
[1] 45 243 78 365 5656 334 90 23 809
> v <-c(v[5], v[7])
> v
[1] 5656 90
3. 向量化
R語言最強大功能之一是函式的向量化,即函式直接對向量的每個元素進行操作。如:
> v <-c(4, 7, 23.5, 76.2, 80)
> x <-sqrt(v)
> x
[1] 2.0000002.645751 4.847680 8.729261 8.944272
向量化函式輸出一個與輸入向量相同長度的結果向量。
R語言支援向量的算術運算:
> v1 <-c(4, 6, 87)
> v2 <-c(34, 32.4, 12)
> v1 + v2
[1] 38.0 38.499.0
如果兩個向量的長度不同,則使用迴圈規則:該規則重複較短的元素,直到得到的長度與較長向量的長度相同,如:
> v1 <-c(4, 6, 8, 24)
> v2 <-c(10, 2)
> v1 + v2
[1] 14 8 18 26
如果較長向量的長度不是較短向量長度的整數倍,則R給出警告:
> v1 <-c(4, 6, 8, 24)
> v2 <-c(10, 2, 4)
> v1 + v2
[1] 14 8 12 34
Warningmessage:
In v1 + v2 : 長的物件長度不是短的物件長度的整倍數
單個數字在R中表示為長度為1的向量,如:
> v1 <-c(4, 6, 8, 24)
> 2 * v1
[1] 8 12 16 48
數字2實際上是c(2)被迴圈,使得v1的所有元素都乘以2。
注意:迴圈規則同樣適用於陣列和矩陣。