R语言编程艺术#01#数据类型向量(vector)
R語言最基本的數據類型-向量(vector)
1、插入向量元素,同一向量中的所有的元素必須是相同的模式(數據類型),如整型、數值型(浮點數)、字符型(字符串)、邏輯型、復數型等。查看變量的類型可以用typeof(x)函數查詢。
> #插入向量元素 > x <- c(88,5,12,13) > x [1] 88 5 12 13 > x <- c(x[1:3],168,x[4]) #插入168數字在13之前 > x [1] 88 5 12 168 13 >?2、刪除向量中的元素,由于R中的向量是連續存儲的,因此不能插入或刪除元素(故上面的插入代碼實際上重新創建了一個新的向量然后將x指向新的向量,類似于C中的指針)
> #刪除向量中的元素 ^_^ > x [1] 88 5 12 168 13 > x <- c(88,5,168,13) > x [1] 88 5 168 13 >3、獲取向量的長量
> #獲取向量的長量 > x [1] 88 5 168 13 > length(x) [1] 4 >4、遍歷向量里所有的元素
>#第一種方法 由于1:length(x)=(1,0),實際上做了兩次迭代 > first1 function(x){ for(i in 1:length(x)){if (x[i]==1) break } return(i) } > y [1] 1 2 3 4 5 6 7 8 > first1(y) [1] 1 > >#第二種方法 用seq函數生成等差序列,元素間隔為1,解決了第一種效率不高的方法 > first2 <- function(x){ + for(i in seq(x)){ + if (x[i]==1) break + } + return(i) + } > > first2(y) [1] 1 >5、向量與數組、矩陣 ?數組與矩陣包括列表,在某種意義上實際上都是向量。只不過它們還有額外的類屬性。如:矩陣有行數和更數等。 ?
> m <- matrix(c(1,2,3,4),nrow = 2,byrow = T) > m[,1] [,2] [1,] 1 2 [2,] 3 4 > m + 10:13[,1] [,2] [1,] 11 14 [2,] 14 17 >在這里2x2的矩陣m中存儲為一個四元向量,即(1,2,3,4),并且以存儲為兩行(默認是以列排序,以行排序加上byrow = T),然后對它加上(10,11,12,13),得最新的矩陣,等效于下面代碼
> m <- matrix(c(1,3,2,4),nrow = 2) > m[,1] [,2] [1,] 1 2 [2,] 3 4 > m + 10:13[,1] [,2] [1,] 11 14 [2,] 14 17 >?6、循環補齊 ?在對兩個向量使用運算符時,如果要求這兩個向量具有相同的長度,R會自動循環補齊(recycle),即重復較短的向量,直到它與另一個向量長度相匹配
> c(1,2,4) + c(6,0,9,20,22) [1] 7 2 13 21 24 Warning message: In c(1, 2, 4) + c(6, 0, 9, 20, 22) :longer object length is not a multiple of shorter object length >等同于下列代碼:
> c(1,2,4,1,2) + c(6,0,9,20,22) [1] 7 2 13 21 24 >#矩陣
> x <- matrix(c(1,2,3,4,5,6),nrow = 3) > x[,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 > x + c(1,2)[,1] [,2] [1,] 2 6 [2,] 4 6 [3,] 4 8 >#矩陣循環補齊
> x <- matrix(c(1,2,3,4,5,6),nrow = 3) > x[,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 > y <- matrix(c(1,2,1,2,1,2),nrow = 3) > y[,1] [,2] [1,] 1 2 [2,] 2 1 [3,] 1 2 > x +y[,1] [,2] [1,] 2 6 [2,] 4 6 [3,] 4 8 >相當于:
7、常用的向量運算 ?包括算術和邏輯運算、向量索引、創建向量等
#R是一種函數式語言,它的每個運處符(+ - * / 。。。)實際上都是函數
#加法 > 2+3 [1] 5 > "+"(2,3) [1] 5 > >c(1,2) + c(3,4) >[1] 4 6 > > "+"(2,3,4) Error in `+`(2, 3, 4) : operator needs one or two arguments>#乘法 > c(1,2) * c(3,4) [1] 3 8 >#減法 > c(3,4) - c(1,2) [1] 2 2 >#除法 > c(3,4) / c(1,2) [1] 3 2 >#取余 > c(3,4) %% c(2,3) [1] 1 1 >8、向量索引 ? R中最重要也是最常的一個運算符就是索引,使用它來選擇給定向量中特定索引的元素來構成子向量。索引向量的格式是 X[Y](X,Y均是向量),它返回的結果是,X中索引為Y的那些元素?!?
> y <- c(1.2,3.9,0.4,0.12) > y [1] 1.20 3.90 0.40 0.12 > y[2:3] #取Y向量中的2-3元素 [1] 3.9 0.4 > v <- 3:4 > y[v] [1] 0.40 0.12 > y[c(1,1,3)] #提取的元素是可以重復的 [1] 1.2 1.2 0.4 >#負數的下標代表我們想剔除的元素,其它提取出來
> y [1] 1.20 3.90 0.40 0.12 > y[-1] #除第一個元素外,提取其它所有的元素 [1] 3.90 0.40 0.12 > y[-1:-2] #除1:2元素外 [1] 0.40 0.12 >9、用運算符創建向量
#用?:能生成指定范圍內數值構成的向量
> 5:8 [1] 5 6 7 8 > #注意運算符優先級別的問題 > i <- 5 > 1:i-1 #這個運算的意思是 (1:i)-1,不是1:(i-1) [1] 0 1 2 3 4 > 1:(i-1) [1] 1 2 3 4 > #查看運算符的優先級別 >?Syntax #可以在R幫助文檔中查看#用seq()創建向量
> seq(1:8) [1] 1 2 3 4 5 6 7 8 > 1:8 #等同于以上代碼 [1] 1 2 3 4 5 6 7 8 > seq(from=5,to=20, by=3) #生成從5-20,且元素間隔為3 [1] 5 8 11 14 17 20 > seq(from=5,to=10, by=0.1) #生成從5-10,且元素間隔為0.1[1] 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6.0 6.1 6.2 [14] 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.0 7.1 7.2 7.3 7.4 7.5 [27] 7.6 7.7 7.8 7.9 8.0 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 [40] 8.9 9.0 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 10.0 > > seq(from =1.1, to=2, length=10)[1] 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 > seq(from =1.1, to=2, length=20) #生成1.1到2,共20個等比數列,常數為0.047368[1] 1.100000 1.147368 1.194737 1.242105 1.289474 1.336842 1.384211[8] 1.431579 1.478947 1.526316 1.573684 1.621053 1.668421 1.715789 [15] 1.763158 1.810526 1.857895 1.905263 1.952632 2.000000 >#等比數列定義
參照:百度百科-等比數列
11、使用 rep()重復向量常數 ?可以把同一常數放在長向量中,rep(x,times)即創建times*length(x)個元素向量,這個向量是x重復times次構成
> x <- rep(8,4) > x [1] 8 8 8 8 > rep(c(5,12,13),3) [1] 5 12 13 5 12 13 5 12 13 > rep(1:3,2) [1] 1 2 3 1 2 3 >#each參數,與times參數不同的是,它指定x交替重復的次數
> rep(c(5,12,13),each=2) [1] 5 5 12 12 13 13 >12、使用all()和any() ?這兩個函數分別判斷其參數中是否至少有一個或全部為TRUE
> x <- 1:10 > any(x>8) [1] TRUE > all(x>8) [1] FALSE > any(x>20) [1] FALSE > all(x>20) [1] FALSE >#any(x > 8) ?all(x > 8),分解,先執行下面運算,得到每個元素的邏輯值,any只要判斷只要有一個為TRUE,其返回結果為:TRUE,否則為FALSE。all則相反,所有為TRUE時返回值才為:TRUE,否則為FALSE。
> x>8[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE [10] TRUE >13、向量化運算符
#向量輸入、向量輸出 ?
向量化運算即使過運算符的(+,-,*,/,%%,>等),如果一個函數中使用了運算符,哪么這個函數就被向量化了,這樣可以有效提高速度
# >運算符 ?>函數分別運用在u[1]和v[1]得到結果TRUE,然后u[2]和v[2]得到結果FALSE。。。
> u <- c(5,2,8) > v <- c(1,3,9) > u > v [1] TRUE FALSE FALSE >#函數 ?平方根、對數、三角函數等都是向量化的
> w <- function(x) return(x + 1) > w(u) [1] 6 3 9 > > sqrt(1:9) [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 [7] 2.645751 2.828427 3.000000 >#向量輸入、矩陣輸出
#matrix() ?在z12函數中返回值就是一個八元向量(即輸出結果是八個數組成的向量),需要通過matrix函數轉換成矩陣,如以下代碼,將結果轉換成8*2的矩陣
> z12 <- function(z) return(c(z,z^2)) > x <- 1:8 > z12(x)[1] 1 2 3 4 5 6 7 8 1 4 9 16 25 36 49 64 > matrix(z12(x),ncol = 2)[,1] [,2] [1,] 1 1 [2,] 2 4 [3,] 3 9 [4,] 4 16 [5,] 5 25 [6,] 6 36 [7,] 7 49 [8,] 8 64 >#sapply() ?該函數跟matrix功能一樣,在這里轉換成的是2*8的矩陣,其它參數以后再學習
> sapply(1:8,z12)[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [1,] 1 2 3 4 5 6 7 8 [2,] 1 4 9 16 25 36 49 64 >14、NA與NULL值
在R中NA表示:缺失值;NULL表示:不存在的值(而不是存在但未知的值)
#NA
由于以下代碼中包含了一個NA元素(缺失值),導致mean()無法計算均值,但是可以通過參數na.rm = T(移除NA),計算其他元素的均值。
> x <- c(88,NA,12,168,13) > x [1] 88 NA 12 168 13 > mean(x) [1] NA > >#NA在不同的向量中模式(數據類型)也不同 > x <- c(88,NA,12,168,13) > x [1] 88 NA 12 168 13 > mode(x[2]) [1] "numeric" > x1 <- c("a","b",NA) > x1 [1] "a" "b" NA > mode(x1[3]) [1] "character" >#NULL
在R中會自動跳過NULL值,在R中NULL是一種特殊對象,沒有類型,可用于變量的初始化值
> x <- c(88,NA,12,168,13) > x [1] 88 NA 12 168 13 > mean(x) [1] NA > >#在R中NULL是一種特殊對象,沒有類型 > x <- NULL > mode(x) [1] "NULL" > x NULL >15、篩選
反映R函數式語言特性的另一特征是“篩選”(filtering),我們可以提取向量中滿足一定條件的元素。
#生成篩選索引
>#要求R提取z中平方大于8的元素 >z <- c(5,2,-3,8) > z [1] 5 2 -3 8 > w <- z[z*z > 8] > w [1] 5 -3 8 > > #等同于以下分解代碼 > > z <- c(5,2,-3,8) > z [1] 5 2 -3 8 > z*z > 8 [1] TRUE FALSE TRUE TRUE > z[c(TRUE,FALSE,TRUE,TRUE)] [1] 5 -3 8 >>j <- z*z > 8
>z[j]
>[1] 5 -3 8
#用例:將x向量中所有大于>3的元素,替換為 0。?
> x <- c(1,3,6,2,20) > x [1] 1 3 6 2 20 > x[x > 3] <- 0 > x [1] 1 3 0 2 0 >#使用subset()函數篩選
當對向量使用subset函數時,它與普通的篩選方法的區別在于處理NA值的方式上,可以自動移除NA值
>#篩選出x中元素平方大于5的> x <- c(6,1:3,NA,12) > x [1] 6 1 2 3 NA 12 > x[x > 5] [1] 6 NA 12 > subset(x,x > 5) [1] 6 12 >
#選擇函數which()
在向量中提取滿足一定條件的元素,返回值是元素的所在的位置。?
> x [1] 6 1 2 3 NA 12 > which(x>5) [1] 1 6 #返回元素位置 > x[which(x>5)] [1] 6 12 >16、向量化的ifelse()函數
在R語言中除了有“if-else"結構,還提供了另一個向量貨的版本,ifelse()函數,格式為:ifelse(條件,為TRUE返回向量,為FALSE返回向量)
> x <- 1:10 > y <- ifelse(x %% 2 == 0,5,12)#對x值取模運算,偶數返回5,奇數返回12 > y[1] 12 5 12 5 12 5 12 5 12 5 >17、測試向量相等
”==“僅對向量元素的值進行比較,identical()函數不僅對比元素的值還對比向量元素的數據類型,正如它字面意思一樣必須完全相同,從下面的代碼可以看出,:產生的元素是整數,c()產生的是浮點數
> x <- 1:2 > y <-c(1,2) > x==y [1] TRUE TRUE > identical(x,y) [1] FALSE > typeof(x) [1] "integer" > typeof(y) [1] "double" >18、向量的名稱
可以給向量元素隨意指定名稱,name()函數可以給向量中的元素命名,或查詢向量元素的名稱,將向量元素的名稱賦值為NULL,可以將元素的名稱移除
> x <- c(1,2,3,4) > x [1] 1 2 3 4 > names(x) NULL > names(x) <- c("a","b","c","d") > names(x) [1] "a" "b" "c" "d" > x a b c d 1 2 3 4 > names(x) <- NULL > x [1] 1 2 3 4 > names(x) NULL >19、c()函數擴展
當傳遞到c()函數中的參數有不同類型時,則會被降級為同一類型,該類型最大限度地保留它們的共同的特性。各種類型的優先級排序是:NULL<raw<邏輯類型<整型<實數類型<復數類型<列表<表達式(把配對列表(pairlist)當作普通列表)
?
> c(1,2,"a") [1] "1" "2" "a" > c(1,2,list(a=3,b=4)) [[1]] [1] 1[[2]] [1] 2$a [1] 3$b [1] 4> c(1,2,c(3.1,4)) [1] 1.0 2.0 3.1 4.0 >?補充c(1,2,list(a=3,b=4))
> x<-c(1,2,list(a=3,b=4)) > x [[1]] [1] 1[[2]] [1] 2$a [1] 3$b [1] 4> x[[1]] [1] 1 > x[[2]] [1] 2 > x[3][1] $a [1] 3> x[4][1] $b [1] 4>
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的R语言编程艺术#01#数据类型向量(vector)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Google Maps和GIS开发资源收
- 下一篇: 祝愿大家都是健康的!