R語法基礎(chǔ)

一、基礎(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)是+

  1. 基本的對(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()操作侠鳄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市死宣,隨后出現(xiàn)的幾起案子伟恶,更是在濱河造成了極大的恐慌,老刑警劉巖毅该,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件博秫,死亡現(xiàn)場(chǎng)離奇詭異潦牛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挡育,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門巴碗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人即寒,你說我怎么就攤上這事橡淆。” “怎么了母赵?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵逸爵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我凹嘲,道長(zhǎng)师倔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任周蹭,我火速辦了婚禮趋艘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凶朗。我一直安慰自己致稀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布俱尼。 她就那樣靜靜地躺著抖单,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遇八。 梳的紋絲不亂的頭發(fā)上矛绘,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音刃永,去河邊找鬼货矮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛斯够,可吹牛的內(nèi)容都是我干的囚玫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼读规,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼抓督!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起束亏,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤铃在,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體定铜,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阳液,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揣炕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帘皿。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖畸陡,靈堂內(nèi)的尸體忽然破棺而出鹰溜,到底是詐尸還是另有隱情,我是刑警寧澤罩锐,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布奉狈,位于F島的核電站卤唉,受9級(jí)特大地震影響涩惑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桑驱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一竭恬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熬的,春花似錦痊硕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至橡伞,卻和暖如春盒揉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兑徘。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工刚盈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挂脑。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓藕漱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親崭闲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肋联,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容