向量是 R 最基本的變量
R 中變量的類型稱為模式碟嘴。
R 中最基本的變量類型是向量小泉,一維的向量,沒有標(biāo)量晶默,任何一個(gè)看似標(biāo)量的變量其實(shí)都是長度為 1 的向量谨娜。
R 中同一向量中元素類型必須相同航攒,例如整型,浮點(diǎn)型趴梢,字符型漠畜,布爾型。
R 中向量是連續(xù)存儲的坞靶,因此不能插入或者刪除憔狞,如果要實(shí)現(xiàn)插入或刪除必須為向量重新賦值。
R 中向量進(jìn)行運(yùn)算時(shí)彰阴,會自動進(jìn)行循環(huán)補(bǔ)齊瘾敢,短向量循環(huán)補(bǔ)齊到長向量的長度再進(jìn)行運(yùn)算。
R 中的矩陣實(shí)際是一個(gè)長向量。
> x <- c(1,2,3)
> x
[1] 1 2 3
> x + 1
[1] 2 3 4
> # 實(shí)際運(yùn)行的是 (1,2,3) + (1,1,1)
許多 R 的內(nèi)置函數(shù)在對變量進(jìn)行運(yùn)算時(shí)簇抵,也是向量化運(yùn)算庆杜,即對向量的每一個(gè)元素進(jìn)行函數(shù)運(yùn)算。
seq 函數(shù)
比 : 更常用的是 seq(from, to, by) 函數(shù) (sequence)碟摆,來生成等差序列:
> seq(1,10)
[1] 1 2 3 4 5 6 7 8 9 10
> seq(from=1,to=10,by=2)
[1] 1 3 5 7 9
> seq(1,10,3)
[1] 1 4 7 10
rep 函數(shù)
rep (指repeat) 函數(shù)形式晃财,rep(x,times) 創(chuàng)建重復(fù) times*length(x) 個(gè)元素的向量,把 x 重復(fù) times 次典蜕。
> rep(8,4)
[1] 8 8 8 8
> rep(c(1,2,3),3)
[1] 1 2 3 1 2 3 1 2 3
> rep(1:3,3)
[1] 1 2 3 1 2 3 1 2 3
> # rep 函數(shù)還有一個(gè) each 參數(shù)断盛,與 times 不同,each 指定 x 交叉重復(fù)的次數(shù)
> rep(c(1,2,3),each=2)
[1] 1 1 2 2 3 3
> rep(c(1,2,3),each=3)
[1] 1 1 1 2 2 2 3 3 3
NULL
NULL 是 R 的一種特殊對象愉舔,沒有模式钢猛,沒有長度,為空轩缤。對向量某個(gè)元素賦值為 NULL 可以刪除該元素厢洞。
篩選
篩選是 R 中最常用的運(yùn)算之一。
> z <- c(5,2,-3,8)
> w <- z[z*z > 8]
> w
[1] 5 -3 8
> z
[1] 5 2 -3 8
> z*z
[1] 25 4 9 64
> # 實(shí)際運(yùn)算是(25,4,9,64) > (8,8,8,8)典奉,結(jié)果也是一個(gè)四元向量躺翻,值為布爾型
> z*z > 8
[1] TRUE FALSE TRUE TRUE
> z[c(TRUE,FALSE,TRUE,TRUE)]
[1] 5 -3 8
ifelse()
向量化的 ifelse() 函數(shù), ifelse(b,u,v), b 是布爾型向量,u,v 都是向量卫玖。
> x <- c(5,2,9,12)
> ifelse(x > 6, 2*x, 3*x)
[1] 15 6 18 24
> # 效果相當(dāng)于 ifelse(c(FALSE,FALSE,TRUE,TRUE),c(10,4,18,24),c(15,6,27,36))公你,但實(shí)際 R 使用“惰性求值”,只有在需要時(shí)表達(dá)式才會計(jì)算假瞬,否則不計(jì)算陕靠。
相對于標(biāo)準(zhǔn)的 if-then-else 結(jié)構(gòu),ifelse() 是向量化語句脱茉,因此有可能快很多剪芥。
測試向量相等
不能直接用 ==,因?yàn)?== 是一個(gè)向量化運(yùn)算琴许,可以結(jié)合 all() 函數(shù)税肪。
> x <- 1:3
> y <- c(1,3,4)
> x == y
[1] TRUE FALSE FALSE
> all(x==y)
[1] FALSE
可以簡單地使用 identical() 函數(shù)。
> identical(x,y)
[1] FALSE
identical() 是判斷兩個(gè)向量是否完全相同榜田,包括類型是否相同益兄。使用 identical() 要小心,看如下例子:
> x <- 1:3
> y <- c(1,2,3)
> identical(x,y)
[1] FALSE
> # 符號 : 產(chǎn)生的是整數(shù)箭券,而 c() 產(chǎn)生的是浮點(diǎn)數(shù)
> typeof(x)
[1] "integer"
> typeof(y)
[1] "double"
連接函數(shù) c()
如果傳遞到 c() 中的數(shù)據(jù)具有不同類型净捅,則它們將被降級為同一類型,該類型最大限度地保留它們的共同特性辩块。
> c(5,2,'abc')
[1] "5" "2" "abc"
> c(5,2,list(a=1,b=4))
[[1]]
[1] 5
[[2]]
[1] 2
$a
[1] 1
$b
[1] 4
與 Python 不同蛔六,c() 函數(shù)對向量有扁平化的效果荆永。
> c(5,2,c(1.5,6))
[1] 5.0 2.0 1.5 6.0
奇怪的東西
在謝益輝主筆的《R語言忍者秘笈》中看到幾個(gè)例子,由于計(jì)算機(jī)存儲數(shù)據(jù)精度的問題国章,有些運(yùn)算會出現(xiàn)莫名其妙的結(jié)果:
> x <- seq(0,1,0.1)
> x
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> y <- c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1)
> y
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> x == y
[1] TRUE TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE
> 0.3 - 0.7 + 0.4 == 0
[1] FALSE
> sqrt(2)^2 == 2
[1] FALSE
具有新想法的人在其想法實(shí)現(xiàn)之前是個(gè)怪人屁魏。