向量是R語言最基本的數據類型。
單個數值(標量)其實沒有單獨的數據類型,它只不過是只有一個元素的向量。
x <- c(1, 2, 4, 9)
x <- c(x[1:3], 88, x[4]) #在最后一個數前面插入一個數值88,可以看到用x[4]可以取出第4個元素,用x[1:3]可以取出前3個元素
typeof(x) #查看向量里的元素的類型,注意默認是double。[1] "double"
mode(x) #r語言中變量類型稱為模式(mode)。[1] "numeric"
length(x) #獲取向量的長度
R不需要提前申明變量,大小寫敏感,數組是從1開始。
冒號運算符
1:4 #R是一種函數式語言,冒號也是一種運算符(實際上這是一種中置運算符的表示法),可以產生序列。[1] 1 2 3 4
":"(1, 4) #與1:4是等價的,用引號引起來,就是一種函數名了,不過這種寫法看上去比1:4怪異多了
5:1 #結果:[1] 5 4 3 2 1
1:10 - 1 #冒號的優先級比加減運算要高,實際上就是(1:10) - 1,結果: [1] 0 1 2 3 4 5 6 7 8 9
1:(10-1) #結果:[1] 1 2 3 4 5 6 7 8 9
循環補齊recycle
這種特性在其它語言中以前還沒有看見過!超強的向量運算功能!
y <- c(1,2,3) + 4 # 單個的數值4會被補齊為c(4,4,4),最后結果為c(5,6,7)
c(1,2,3) * c(4,5,6) # 結果:[1] 4 10 18,這里表示的兩個向量中的元素分別相乘,如果想求向量的點積(dot prod),就需要用這個%*%函數了
c(1,2,3) %*% c(4,5,6) #結果是一個1x1的矩陣,其中只有一個元素14
c(1,2,3) * c(4,5,6,7) #結果:[1] 4 10 18 7。同時給出警告信息:長的對象長度不是短的對象長度的整倍數
取模運算%%
c(7,8,9) %% 3 #結果:[1] 1 2 0
向量索引
普通的語言中索引只能是正整數,但這里的索引可以是向量,還可以是負數。嚴格說來這不能叫索引,而是篩選操作,看后面的filtering
x <- c(1,3,5,7,9)
x[2] #結果:[1] 3
x[c(5,4,3,2,1)] #結果為:[1] 9 7 5 3 1
x[sample(1:5)] #把1,3,5,7,9亂序排列,每次運行你會得到一個不同的結果
x[-1] #[1] 3 5 7 9,把第一個元素除掉,這是我非常喜歡的語法特性!
x[1:3] #結果:[1] 1 3 5
seq()創建向量
seq(from=12, to=30, by=3) # 也可以寫成: seq(12,30,3)
[1] 12 15 18 21 24 27 30
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
x <- c(1,2,4,8)
seq(x)
[1] 1 2 3 4
seq(1,5)與1:5是一個意思
rep重復向量常數
rep(8, 4)
[1] 8 8 8 8
rep(1:3, 2)
[1] 1 2 3 1 2 3
rep(1:3, each=2)
[1] 1 1 2 2 3 3
all()和any()
x<-(1:10)
any(x>8) #只要向量中有一個大於8,就返回真
[1] TRUE
all(x>8) #所有都大於8,才返回真
[1] FALSE
向量化
w <- function(x) return (x+1) #加號運算符支持向量,所以自定義的函數w也是向量化的!看上去簡單的x+1,但我們已經寫出了一個向量函數
w(1) #這是我們最熟悉的函數調用
[1] 2
w(c(1,3,5)) #可以對向量進行運算
[1] 2 4 6
NA與NULL
在統計過程中,經常會遇到缺失值,稱為NA,即Not Available。
R語言中許多函數可以忽略NA值。
> x <- c(1,2,NA,4)
> mean(x) #有缺失值,無法計算平均值
[1] NA
> mean(x, na.rm=TRUE) #忽略NA值
[1] 2.333333
> mean(c(1,2,NULL,4)) # NULL值會自動略過
[1] 2.333333
> length(c(1,2,NA,4)) #統計個數時NA被計算在內
[1] 4
> length(c(1,2,NULL,4))
[1] 3
篩選filtering
有點像索引,因為也是放在[]里,可以把滿足一定條件的元素取出來。
> z <- 1:10
> z
[1] 1 2 3 4 5 6 7 8 9 10
> z[z%%2==0]
[1] 2 4 6 8 10
> z%%2 #取模
[1] 1 0 1 0 1 0 1 0 1 0
> z%%2==0 #注意這里的0被自動循環補齊
[1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE
> x<-c(1,3,5,6,9)
> x[x>3] <- 0 #把大於3的數值都置為0
> x
[1] 1 3 0 0 0
subset也是篩選,區別在於處理NA的方式上
> x<-c(1,2,NA,4,5)
> x[x>3]
[1] NA 4 5
> subset(x, x>3) #自動把NA剔除掉了
[1] 4 5
which()可以找到滿足條件的元素的位置
> x <- c(5, 2, -3, 9, 1)
> x[x*x>8]
[1] 5 -3 9
> which(x*x>8)
[1] 1 3 4
向量化的ifelse()
> x <- c(5, 2, -3, 9, 1)
> ifelse(x>3, 2*x, 3*x)
[1] 10 6 -9 18 3
判斷向量是否相等
> x <- 1:3
> y <- c(1,3,4)
> all(x==y)
[1] FALSE
> identical(x,y)
[1] FALSE
注意1:3是整數,c(1,2,3)是浮點數,它們不相等:
> identical(1:3, c(1,2,3))
[1] FALSE
> typeof(1:3)
[1] "integer"
> typeof(c(1,2,3))
[1] "double"
給向量元素命名names()
> workdays <- 1:5
> names(workdays) <- c("mon", "tue", "wed", "thu", "fri")
> workdays
mon tue wed thu fri
1 2 3 4 5
可以用名稱來引用元素
> workdays["wed"]
wed
3