1. 程式人生 > >R語言學習之基礎知識一

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。

注意:迴圈規則同樣適用於陣列和矩陣。