R學習 第一篇:變量和向量


R是向量化的語言,最突出的特點是對向量的運算不需要顯式編寫循環語句,它會自動地應用於向量的每一個元素。對象是R中存儲數據的數據結構,存儲在內存中,通過名稱或符號訪問。對象的名稱由大小寫字母、數字0-9、點號和下划線組成,名稱是區分大小寫的,並且不能以數字開頭,特殊的對象名稱可以通過界定符 `` 來轉為合法的對象名稱,注意,點號( . ) 被視為沒有特殊含義的單字符。

R語言非常靈活,例如:

  • R語言區分大小寫,不管是變量名和函數名,都是大小寫敏感的。
  • 直接給變量賦值,R中不能顯式聲明變量和類型;
  • 變量的類是可變的,就是說,同一個變量可以存儲字符,也可以存儲日期和時間,也可以存儲數值。
  • R語句的分隔符是分號“;”,或換行符,當語句結束時,可以不使用分號“;”,R語言會自動識別語句結束的位置。
  • R語言只支持單行注釋,注釋由符號#開頭,當前行出現在#之后的任何文本都會被R解釋器忽略。
  • R支持向量化運算

R語言擁有強大的數據處理和繪圖功能,還是免費的,是數據分析人員必學必會的一門語言。

一,變量是什么樣子?

首先,我們學習變量的用法,變量用於臨時存儲數據,以便重用。在R語言中,變量可以直接賦值,跟C、Java等語言不同,R的變量不能聲明,因為R沒有這個概念。變量名是大小寫敏感的,變量名可以包含字符、數字、和下划線,對於包含特殊字符的變量名,需要使用 `` 把名稱轉換位有效的變量名,例如:

dataset$`#Visitors (T3M)`

用戶可以使用make.names() 獲得一個有效的變量名。為變量賦值的操作符是:<- 或 =,建議使用<- 作為變量的賦值符號,以下代碼為變量v賦值,並輸出變量的值:

> v<-3
> v
[1] 3

注意,輸出結果[1],表明從變量的第一個元素開始顯示,這意味着,變量實際上是一個向量,R語言中不存在標量類型,最小的數據類型是向量,而向量是一系列有序的值。R按照序列的順序,逐個打印向量的各個元素。

函數print用於輸出變量的值,在控制台中,可以直接輸入變量名,控制台自動調用print函數打印變量的值。

如果想把賦值和打印處於寫在同一行中,可以把賦值語句寫在()中,這樣,就能在同一行中完成變量的賦值和打印:

>(v<-3)
[1] 3

1,變量的常用通用類

R中所有的變量都屬於特定的類(class),類用於表示變量屬於的類型(type),可以認為類(class)和類型(type)相同,常用的通用類是:

  • 數值integernumeric
  • 字符character,使用單引號或雙引號
  • 日期和時間:日期的類型是Date,時間是POSIXctPOSIXt
  • 邏輯logical,有效值是:TRUEFALSE

用戶可以通過class(variable)函數查看變量的類型:

> v <- 1:3
> v
[1] 1 2 3
> class(v)
[1] "integer"

變量可以存儲任何數據類型,也可以存儲任何數據對象,例如,函數,分析的結果以及一個圖形。單個變量在某時刻取值為一個數字,而后可以被賦值為字符,還可以被賦值為其他數據類型。

2,變量的類檢查和類轉換

通過is.* 函數檢查變量的類型,通過as.*函數轉換變量的類型

> vc <- c('1','2','3')
> is.character(vc)
[1] TRUE
> vi <- as.integer(vc)
> is.integer(vi)
[1] TRUE

3,變量的刪除

在R中,創建變量會占用系統的存儲空間,而刪除變量會釋放存儲空間;為了確保存儲空間的及時釋放,可以使用gc函數,強制系統回收垃圾,釋放操作系統中不再使用的存儲空間,R也會自動周期性地執行垃圾回收。使用rm函數把變量從當前的作用域中刪除:

> rm(variable)
> gc()

4,NULL值和NA值

NULL是個特殊值,表示未知值,NA表示缺失值,NULL和NA之間最大的區別是:NA是一個標量值,長度為1,而NULL不會占用任何空間,長度為零:

> length(NA)
[1] 1
> length(NULL)
[1] 0

使用is.null函數驗證NULL值,使用is.na函數驗證NA值:

> is.null(NULL)
[1] TRUE
> is.na(NA)
[1] TRUE

二,向量

向量是R語言中最基本的數據結構,向量是有序的數據序列,序列中的每一個數據項叫做向量的一個元素,同一個向量的元素的數據類型必須是相同的,同一個向量中無法混雜多種不同類型的元素,向量元素可以是數值,字符,邏輯值等。

1,向量的創建

向量(Vector,也叫矢量)是數據的有序序列。函數c把一系列的數據拼接起來,創建一個向量;也可以通過c函數和冒號操作符,創建向量,例如:

> c(1,2,3,4)
[1] 1 2 3 4
> c(1:4)
[1] 1 2 3 4

也可以通過vector(class,length)函數,創建指定類和長度的向量,向量的每個元素的值是指定類型的默認值,對於數值是0,對於邏輯類是FALSE,對於字符類是空字符串,或NULL。

> vector('integer',3)
[1] 0 0 0

R為每個類型都包裝了一個創建向量的函數,格式是class_name(length),例如:

> numeric(3)
[1] 0 0 0

2,向量的長度

向量的長度,就是向量包含的元素的個數,通過length函數獲取向量的長度

> length(c(1:3))
[1] 3

3,為向量的各個元素命名

R能夠為向量的各個元素命名,元素的命名有兩種模式,第一種模式是在創建向量時為元素命名,第二種模式是通過names函數為元素命名:

> (v <- c(a=1,b=2,c=3))
a b c 
1 2 3 
> names(v)<- c('va','vb','vc')
va vb vc 
1 2 3 

輸出的結果中,並沒有[1],這說明,無名的向量是按照序列的順序輸出的。names()函數也能獲得向量元素的名稱,如果向量中沒有一個元素有名字,那么names()函數返回NULL。

三,序列

特別地,對於正整數序列,可以使用冒號 : 操作符,該操作符能夠產生一個序列,例如 n:m,用於創建從數值n開始,步長為1,依次遞增,到數值m結束的有序的數值序列:

> 1:3
[1] 1 2 3

R內置seq函數家族,用於創建整數序列。seq函數用於創建序列,參數分別是開始值(from),結束值(to),步長(by),例如:

seq(from = 1, to = 1, by=step)

seq.int是seq函數的包裝,步長不為1的數值序列,可以通過seq.int函數來實現,該函數有三個參數,第一個參數是序列的開始值,第二個參數是序列的結束值,第三個參數默認值是1,用於指定步長。

> seq.int(1,5,2)
[1] 1 3 5

函數seq_len(n) 用於創建長度為n的序列,相當於設置seq.int函數的:開始(from)為1,步長(by)為1,終止值(to)為n:

seq_len(2)
[1] 1 2

四,索引向量

向量沒有維數,這意味着沒有列向量或行向量之分。通常情況下,通過下標和[]的組合來訪問向量中特定位置的元素,索引向量的格式是v[n],n 叫做向量的下標,下標是向量元素的位置,第一個元素的位置是1,依次加1。如果下表超出向量的長度范圍,不會導致錯誤,但是向量會返回缺失值(NA);如果不設置任何下標,那么將返回整個向量的值,R會按照元素在向量中的位置,順序打印出向量的元素值。除了下標和[] 之外,R還提供其他方式來訪問向量的元素:元素名稱、邏輯向量。

1,下標為整數或整數向量

當n值為正整數時,返回特定位置的元素的值;當n值為負整數時,不返回特定位置的元素的值;當n值為整數向量時,返回特定位置的元素。

> v <- 1:3
> v[1]
[1] 1
> v[-1]
[1] 2 3

v[-1]和 v[c(2:3)]返回的元素相同。

2,下標為邏輯向量

當n值為邏輯向量時,返回位置為true的元素的值;

> v[v<=2]
[1] 1 2

v[v<=2]和v[c(TRUE,TRUE,FALSE)]返回的元素相同。

3,下標為字符或字符向量

對於元素被命名的命名向量,給向量傳入字符向量,命名向量返回指定名字的元素值;

> v <-(a=1,b=2,c=3)
> v[c('a','b')]
a b 
1 2 

五,向量元素的位置

向量中包含一系列的數據,如何選擇向量中符合條件的元素呢?在上節中,可以通過多種方式來索引向量的元素,如果知道符合條件的元素的位置,那么R就可以使用位置來索引向量的元素值。

1,which函數

which函數用於返回邏輯向量中元素值為TRUE的位置,

> v <- c(1,3,7,2)
> v>2
[1] FALSE  TRUE  TRUE FALSE
> which(v>2)
[1] 2 3
> v[which(v>2)]
[1] 3 7

2,邏輯向量

最簡單的方式是使用邏輯向量來索引向量的元素

> v[v>2]
[1] 3 7

六,向量的循環

R支持向量化運算,這意味着,運算符或函數能夠作用於向量中的每個元素,而無需顯式地編寫循環語句,這種內置的循環,用於對向量的各個元素執行計算,性能是非常高的。

1,向量和單個數值相加

向量和單個數值n相加,是把向量的每個元素都和單個數值n相加,返回的結果是向量:

> x<-c(1:3)
> x+1 [1] 2 3 4

2,向量和向量相加

向量和向量相加的邏輯是在相同的序列位置上,對兩個向量的元素相加,返回的結果是向量。在向量和向量做運算時,盡量使兩個向量具有相同的長度(length):

> a=1:3
> b=4:6
> a+b
[1] 5 7 9

當兩個向量的長度不同時,R會循環短的向量,以配合較長的向量。如果長向量不是短向量的整數倍,R將拋出警告消息。推薦的做法是:對長度相同的兩個向量做運算。

七,向量元素的追加,刪除和更新

可以向向量中追加元素,例如,向矢量的末尾追加一個元素:

> r <- c(1,3,4)
> r[4] <- 5
> r [1] 1 3 4 5

向量不能直接刪除特定位置的元素,但是,我們可以通過為向量重新賦值來實現:

> r <- r[r!=4]
> r [1] 1 3 5

更新向量特定位置的元素值,只需要為向量的指定元素賦予新值:

> r[3] <- 4
> r
[1] 1 3 4

八,向量的排序和排名

排序:使用sort函數對向量進行排序,order函數返回元素在排序之后的位置,v[order(v)]返回和sort(v)相同的結果:

> v <- c(1,3,5,2,4)
> sort(v)
[1] 1 2 3 4 5
> order(v)
[1] 1 4 2 5 3
> v[order(v)]
[1] 1 2 3 4 5

排名:rank函數為數據框中的每個元素進行排名,不過rank函數只能作用於向量,只能返回向量元素的排名:

rank(x, na.last = TRUE,
     ties.method = c("average", "first", "last", "random", "max", "min"))

 

 

參考文檔:

Quick-R


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM