一、基礎(chǔ)
R是一種語法非常簡(jiǎn)單的表達(dá)式語言(expression language),大小寫敏感脐瑰。 可以在R環(huán)境下使用的命名字符集依賴于R所運(yùn)行的系統(tǒng)和國(guó)家(系統(tǒng)的locale 設(shè)置)经宏、允許數(shù)字、字母、“.”和“_”
1.命名
命名必須以”.”或者字母開頭旺订,以”.”開頭時(shí)第二個(gè)字符不允許是數(shù)字乍狐。
2.基本命令
基本命令要么是表達(dá)式(expressions)赠摇,要么就是賦值(assignments)。
表達(dá)式:命令將被解析,并將結(jié)果顯示在屏幕上藕帜,同時(shí)清空該命令所占內(nèi)存烫罩。
賦值:命令將被解析,并把值傳給變量洽故,但結(jié)果不會(huì)自動(dòng)顯示在屏幕上贝攒。
命令可以被”;”隔開或者另起一行∈鄙酰基本命令可以通過大括弧{},放在一起構(gòu)成一個(gè)復(fù)合表達(dá)式隘弊。
注釋:一行中以井號(hào)”#”開頭 換行:如果一條命令在一行結(jié)束的時(shí)候在語法上還不完整,換行提示符荒适,默認(rèn)是+
- 基本的對(duì)象
R創(chuàng)建和控制的實(shí)體被稱為對(duì)象梨熙。它們可以是變量,數(shù)組刀诬,字符串咽扇,函數(shù),或者其他通過這些實(shí)體定義的一般性的結(jié)構(gòu)舅列。
矩陣(matrix)或者更為一般的數(shù)組(array)是多維的廣義向量肌割。實(shí)際上,它們就是向量帐要,而且可以同時(shí)被兩個(gè)或者更多個(gè)索引引用把敞,并且以特有的方式顯示出來。
因子(factor)為處理分類數(shù)據(jù)提供的一種有效方法榨惠。
列表(list)是一種泛化(generalform)的向量奋早。它沒有要求所有元素是同一類型,許多時(shí)候它本身就是向量和列表類型赠橙。列表為統(tǒng)計(jì)計(jì)算的結(jié)果返回提供了一種便利的方法耽装。
數(shù)據(jù)框(data frame)是和矩陣類似的一種結(jié)構(gòu)。在數(shù)據(jù)框中期揪,列可以是不同的對(duì)象掉奄。可以把數(shù)據(jù)框看作是一個(gè)行表示觀測(cè)個(gè)體并且(可能)同時(shí)擁有數(shù)值變量和分類變量的‘?dāng)?shù)據(jù)矩陣’凤薛。許多實(shí)驗(yàn)數(shù)據(jù)都可以很好的用數(shù)據(jù)框描述姓建,處理方式是分類變量而響應(yīng)值是數(shù)值變量。
函數(shù)(function)是可以保存在項(xiàng)目工作空間的R對(duì)象缤苫。該對(duì)象為R提供了一個(gè)簡(jiǎn)單而又便利的功能擴(kuò)充方法速兔。當(dāng)編寫你自己的函數(shù)在R會(huì)話過程中,對(duì)象是通過名字創(chuàng)建和保存的活玲。objects(),ls()可以顯示當(dāng)前會(huì)話的對(duì)象名字涣狗。rm()可以刪除對(duì)象谍婉。
對(duì)象持久化
R會(huì)話中創(chuàng)建的所有對(duì)象可以永久地保存在一個(gè)文件中以便于以后的R會(huì)話調(diào)用。在每一次R會(huì)話結(jié)束的時(shí)候镀钓,你可以保存當(dāng)前所有可用的對(duì)象穗熬。如果你想這樣做,這些對(duì)象將會(huì)寫入當(dāng)前目錄下一個(gè)叫.RData的文件中丁溅,并且所有在這次會(huì)話中用過的命令行都會(huì)被保存在.Rhistory的文件中死陆。當(dāng)R再次在同一目錄下啟動(dòng),這些對(duì)象將從這個(gè)文件中重新導(dǎo)入工作空間唧瘾。同時(shí)措译,相關(guān)的歷史命令文件也會(huì)被導(dǎo)入。
二饰序、向量和賦值
向量是由一串有序數(shù)值構(gòu)成的序列
x <- c(10.4, 5.6, 3.1, 6.4, 21.7);x
[1] 10.4 5.6 3.1 6.4 21.7
函數(shù)c()完成的賦值語句领虹,這里的函數(shù)c()可以有任意多個(gè)參數(shù),而它返回的值則是一個(gè)把這些參數(shù)首尾相連形成的向量求豫。
賦值也可以用函數(shù)assign()實(shí)現(xiàn)塌衰。
assign("x", c(10.4, 5.6, 3.1, 6.4, 21.7));x
[1] 10.4 5.6 3.1 6.4 21.7
賦值符<-,->可以看作是該命令一個(gè)語義上的縮寫。
c(10.4, 5.6, 3.1, 6.4, 21.7) -> x;x
[1] 10.4 5.6 3.1 6.4 21.7
1.向量運(yùn)算
在算術(shù)表達(dá)式中使用向量將會(huì)對(duì)該向量的每一個(gè)元素都進(jìn)行同樣的算術(shù)運(yùn)算蝠嘉。出現(xiàn)在同一個(gè)表達(dá)式中的向量最好是長(zhǎng)度一致最疆。如果他們的長(zhǎng)度不一樣,該表達(dá)式的值將是一個(gè)和其中最長(zhǎng)向量等長(zhǎng)的向量蚤告。表達(dá)式中短的向量會(huì)被循環(huán)使用以達(dá)到最長(zhǎng)向量的長(zhǎng)度努酸。對(duì)于一個(gè)常數(shù)就是簡(jiǎn)單的重復(fù)。
x <- 1:5
y <- 1:3
v <- 2*x + y + 1;v
[1] 4 7 10 10 13
2.邏輯向量
邏輯向量元素可以被賦予的值,有TRUE杜恰,F(xiàn)ALSE 和NA 邏輯向量可以由條件式(conditions)產(chǎn)生 temp <- x > 13
temp <- 1 < 3;temp
[1] TRUE
3.字符向量
字符向量就是字符串获诈,可以用雙引號(hào)和單引號(hào)作分割符。
paste():可以把單獨(dú)的字符連成字符串心褐,可以有任意多的參數(shù)舔涎。參數(shù)中的任何數(shù)字都將被顯式地強(qiáng)制轉(zhuǎn)換成字符串,而且以同樣的方式在終端顯示逗爹。默認(rèn)的分隔符是單個(gè)的空格符亡嫌。
修改分隔符換成空字符""
labs <- paste(c("X","Y"), 1:10, sep="");labs
[1] "X1" "Y2" "X3" "Y4" "X5" "Y6" "X7" "Y8" "X9" "Y10"
4.索引向量:通過索引值可以選擇和修改一個(gè)數(shù)據(jù)集的子集
一個(gè)向量的子集元素可以通過向量名后面的方括號(hào)中加入索引向量得到。如果一個(gè)表達(dá)式的結(jié)果是向量掘而,則我們可以直接在表達(dá)式的末尾方括號(hào)中加入索引向量以得到結(jié)果向量的子向量.
邏輯向量:索引向量必須和被挑選元素的向量長(zhǎng)度一致挟冠。向量中對(duì)應(yīng)索引向量元素為TRUE的元素將會(huì)被選中,而那些對(duì)應(yīng)FALSE的元素則被忽略镣屹。
x <- c(TRUE, TRUE, FALSE, TRUE, FALSE)
y <- x[x];y
[1] TRUE TRUE TRUE
正整數(shù)向量:索引向量必須是1,2,…,length(x)的子向量圃郊。索引向量中索引對(duì)應(yīng)的元素將會(huì)被選中价涝,并且在結(jié)果向量中的次序和索引向量中的次序一致女蜈。這種索引向量可以是任意長(zhǎng)度的,結(jié)果向量的長(zhǎng)度和索引向量完全一致。
x <- 1:10
x[1:5]
[1] 1 2 3 4 5
負(fù)整數(shù)向量:這種索引向量指定被排除的元素而不是包括進(jìn)來伪窖。
x <- 1:10
x[-(1:5)]
[1] 6 7 8 9 10
字符串向量:這可能僅僅用于一個(gè)對(duì)象可以用names屬性來識(shí)別它的元素逸寓。名字向量的子向量可以像上面第二條提到的正整數(shù)標(biāo)簽一樣使用。
fruit <- c(5, 10, 1, 20)
names(fruit) <- c("orange”, “banana”, “apple”, “peach”)
lunch <- fruit[c(“apple”,“orange”)];lunch
apple orange
1 5
三覆山、運(yùn)算符
算術(shù)運(yùn)算符:+ - * /
邏輯運(yùn)算符:<竹伸,<=,>簇宽,>=勋篓,==,!=, &, |, !
數(shù)學(xué)函數(shù):log,exp魏割,sin譬嚣,cos,tan钞它,sqrt 拜银,max ,min遭垛,range尼桶,length,sum锯仪,prod泵督,var
注:var(x): 等價(jià)于sum((x-mean(x))^2)/(length(x)-1)
四、控制語句
1.條件語句:if
if (expr1) expr2 else expr3
2.循環(huán)控制:for,repeat,while
for (name in expr1) expr2
其中name 是循環(huán)變量庶喜,expr1是一個(gè)向量表達(dá)式幌蚊,而expr2常常是根據(jù)虛擬變量name而設(shè)計(jì)的成組表達(dá)式。在name訪問expr1所有可以取到的值時(shí)溃卡,expr2都會(huì)運(yùn)行溢豆。
例如使用for和if:
for (i in 1:5) {
if (i %% 2 == 0) {
print(paste(i, "is even"))
} else {
print(paste(i, "is odd"))
}
- }
[1] "1 is odd"
[1] "2 is even"
[1] "3 is odd"
[1] "4 is even"
[1] "5 is odd"
警告:相比其他程序語言,R代碼里面很少使用for(),執(zhí)行效率很低
repeat expr
while (condition) expr
while例子:
x <- 1:5
sum <- 0
i <- 1
while (i <= length(x)) {
sum <- sum + x[i]
i <- i + 1
- }
sum
[1] 15
repeat例子:
x <- 1:5
sum <- 0
i <- 1
repeat {
if (i > length(x)) {
break
}
sum <- sum + x[i]
i <- i + 1
- }
sum
[1] 15
關(guān)鍵字break:可以用于結(jié)束任何循環(huán)瘸羡,甚至是非常規(guī)的漩仙。它是結(jié)束repeat 循環(huán)的唯一辦法。 關(guān)鍵字next:可以用來結(jié)束一次特定的循環(huán)犹赖,然后直接跳入"下一次"循環(huán)队他,類似大家熟悉的continue。
五峻村、 生成正則序列
1:30語句等價(jià)于向量c(1,2,…,29,30)麸折,30:1語句可用來產(chǎn)生一個(gè)逆向的數(shù)列。 seq:數(shù)列生成中最為常用的工具
seq(1,5,1)
[1] 1 2 3 4 5
rep:把一個(gè)數(shù)的完整拷貝多次粘昨,保持?jǐn)?shù)列順序
x <- 1:3
rep(x, times=2)
[1] 1 2 3 1 2 3
六垢啼、缺損值
在某些情況下窜锯,向量的元素可能有殘缺。當(dāng)一個(gè)元素或者值在統(tǒng)計(jì)的時(shí)候"不可得到"(not available)或者"值丟失"(missing value)芭析,相關(guān)位置可能會(huì)被保留并且賦予一個(gè)特定的值NA锚扎。任何含有NA 數(shù)據(jù)的運(yùn)算結(jié)果都將是NA。 函數(shù)is.na(x)返回一個(gè)和x同等長(zhǎng)度的向量馁启。它的某個(gè)元素值為TRUE 當(dāng)且僅當(dāng)x中對(duì)應(yīng)元素是NA驾孔。
z <- c(1:3,NA); ind <- is.na; ind
[1] FALSE FALSE FALSE TRUE
第二種"缺損"值,也稱為非數(shù)值NaN(Not a Number)
0/0 或 Inf
七惯疙、 對(duì)象
1.內(nèi)在屬性:模式和長(zhǎng)度
R操作的實(shí)體是對(duì)象翠勉。實(shí)數(shù)或復(fù)數(shù)向量,邏輯向量和字符串向量之類的對(duì)象屬于"原子"型的對(duì)象霉颠,因?yàn)樗鼈兊脑囟际且粯拥念愋突蚰J矫剂狻的對(duì)象類型包括數(shù)值型,復(fù)數(shù)型掉分,邏輯型,字符型和原生型俭缓。向量必須保證它的所有元素是一樣的模式。因此任何給定的向量必須明確屬于邏輯性酥郭,數(shù)值型华坦,復(fù)數(shù)型,字符型或者原生型不从。
列表是任何模式的對(duì)象的有序序列惜姐。列表被認(rèn)為是一種"遞歸"結(jié)構(gòu)而不是原子結(jié)構(gòu),因?yàn)樗鼈兊脑乜梢砸运鼈兏髯缘姆绞絾为?dú)列出。函數(shù)和表達(dá)式也是遞歸結(jié)構(gòu)椿息。
所有對(duì)象都有模式(mode)和長(zhǎng)度(length)兩個(gè)內(nèi)在屬性
x <- 1:3
mode(x)
[1] "numeric"
length(x)
[1] 3
2.外部屬性
attributes(x):給出對(duì)象當(dāng)前定義的非內(nèi)在屬性的列表歹袁。 attr(object, name): 可以用來設(shè)置對(duì)象的外部屬性。
z<-c(1:3,NA)
attr(z, "name") <- "abc"
attributes(z)
$name
[1] "abc"
3.對(duì)象的類屬性
R里面的所有對(duì)象都屬于類(class)寝优,可以通過函數(shù)class(x)查看条舔。 對(duì)于簡(jiǎn)單的向量,類是對(duì)應(yīng)的模式(mode):"numeric"乏矾,"logical"孟抗,"character" 或者"list",其他的類型钻心,像"matrix"凄硼,"array","factor" 和"data.frame" 就可能是其他值捷沸。
八摊沉、因子(factor)
假定我們有一份來自澳大利亞所有州和行政區(qū)的信息樣本以及他們各自所在地的州名。
state <- c("tas", "sa", "qld", "nsw", "nsw", "nt")
在字符向量中痒给,"有序"意味著以字母排序的说墨。
創(chuàng)建因子factor:
statef <- factor(state)
statef
[1] tas sa qld nsw nsw nt
Levels: nsw nt qld sa tas
levels():可以用來得到因子的水平(levels)骏全。
levels(statef)
[1] "nsw" "nt" "qld" "sa" "tas"
函數(shù)tapply()和不規(guī)則數(shù)組
為計(jì)算樣本中每個(gè)州的平均收入,我們可以用函數(shù)tapply():
incomes <- c(60, 49, 40, 61, 64, 60)
incmeans <- tapply(incomes, statef, mean)
incmeans
nsw nt qld sa tas
62.5 60.0 40.0 49.0 60.0
函數(shù)tapply() 可以用來處理一個(gè)由多個(gè)分類因子決定的向量下標(biāo)組合婉刀。
九、小結(jié)
R語言中使用的命名字符集依賴于R所運(yùn)行的系統(tǒng)和國(guó)家(系統(tǒng)的locale 設(shè)置)序仙、允許數(shù)字突颊、字母、“.”和“_”潘悼,命名必須以”.”或者字母開頭律秃,以”.”開頭時(shí)第二個(gè)字符不允許是數(shù)字,<-治唤,->棒动,R語言的基本對(duì)象有矩陣、因子宾添、列表船惨、數(shù)據(jù)框和函數(shù),assign()都可以賦值缕陕,c()可以有任意多個(gè)參數(shù)粱锐,而它返回的值則是一個(gè)把這些參數(shù)首尾相連形成的向量,paste()可以把單獨(dú)的字符連成字符串扛邑,可以有任意多的參數(shù)怜浅,運(yùn)算符有算術(shù)運(yùn)算符、邏輯運(yùn)算符蔬崩、數(shù)學(xué)函數(shù)恶座,控制語句有if...else,for,while,repeat,seq()是數(shù)列生成中最為常用的工具,rep()把一個(gè)數(shù)的完整拷貝多次沥阳,并保持?jǐn)?shù)列順序跨琳,在某些情況下,向量的元素可能有殘缺桐罕。當(dāng)一個(gè)元素或者值在統(tǒng)計(jì)的時(shí)候"不可得到"(not available)或者"值丟失"(missing value)湾宙,相關(guān)位置可能會(huì)被保留并且賦予一個(gè)特定的值NA,對(duì)象有內(nèi)在屬性和外在屬性冈绊,因子中常用levels()和tapply()操作侠鳄。