本章內(nèi)容主要學(xué)習(xí)
1肤视、數(shù)學(xué)與統(tǒng)計(jì)函數(shù)
2徙赢、字符處理函數(shù)
3字柠、循環(huán)和條件執(zhí)行
4、自編函數(shù)
5狡赐、數(shù)據(jù)整合與重塑
5.1數(shù)值和字符處理函數(shù)
5.1.1數(shù)學(xué)函數(shù)
其中對(duì)數(shù)做變換是這些函數(shù)的一個(gè)主要用途窑业。這些函數(shù)也可以作用于矩陣、數(shù)據(jù)框枕屉、和數(shù)值向量常柄。
sqrt(c(4, 16, 25))
的返回值為c(2,4, 5)
5.1.2統(tǒng)計(jì)函數(shù)
z<-mean(x,trim=0.5,na.rm=TRUE)
截尾平均數(shù),即丟棄了最大5%和最小5%的數(shù)據(jù)和所有缺失值后的算術(shù)平均數(shù)搀擂。學(xué)會(huì)使用help()使用每個(gè)函數(shù)的具體用法
其中主要是
diff(x,lag=n)
和quantitle(x,probs)
函數(shù)的學(xué)習(xí)使用西潘。數(shù)據(jù)標(biāo)準(zhǔn)化
函數(shù)scale()對(duì)矩陣或者數(shù)據(jù)框指定列進(jìn)行均值為
0
,標(biāo)準(zhǔn)差為1
的標(biāo)準(zhǔn)化
newdata<-scale(mydata)
newdata<-scale(mydata)*sd+M
#其中M是想要的均值哨颂,SD為想要的標(biāo)準(zhǔn)差
newdata<-transform(mydata,myvar=sacle(myvar)*10+50)
#對(duì)指定列而不是整個(gè)矩陣或數(shù)據(jù)框進(jìn)行標(biāo)準(zhǔn)化
5.1.3概率函數(shù)
概率函數(shù)通常用來生成特征已知的模擬數(shù)據(jù)喷市,以及在用戶編寫的統(tǒng)計(jì)函數(shù)中計(jì)算概率值
其中第一個(gè)字母表示其所指分布的某一方面:
d = 密度函數(shù)(density)
p = 分布函數(shù)(distribution function)
q = 分位數(shù)函數(shù)(quantile function)
r = 生成隨機(jī)數(shù)(隨機(jī)偏差)
標(biāo)準(zhǔn)正態(tài)分布(均值為0,標(biāo)準(zhǔn)差為1)
在每次生成偽隨機(jī)數(shù)的時(shí)候威恼,函數(shù)都會(huì)使用一個(gè)不同的種子品姓,因此也會(huì)產(chǎn)生不同的結(jié)果。你可以通過函數(shù)set.seed()顯式指定這個(gè)種子沃测,讓結(jié)果可以重現(xiàn)(reproducible)缭黔。
5.1.4字符處理函數(shù)
函數(shù)grep()、sub()和strsplit()能夠搜索某個(gè)文本字符串(fixed=TRUE)或某個(gè)正則表達(dá)式(fixed=FALSE蒂破,默認(rèn)值為FALSE)馏谨。正則表達(dá)式:
^[hc]?at
5.1.5其他實(shí)用函數(shù)
注意
cat
函數(shù)的用法
5.1.6將函數(shù)應(yīng)用于矩陣和數(shù)據(jù)框
R函數(shù)的諸多有趣特性之一,就是它們可以應(yīng)用到一系列的數(shù)據(jù)對(duì)象上附迷,包括標(biāo)量惧互、向量哎媚、矩陣、數(shù)組和數(shù)據(jù)框喊儡。
apply(x,MARGIN,FUN,...)
,x為數(shù)據(jù)對(duì)象拨与,MARGIN是維度的下標(biāo),F(xiàn)UN是由你指定的函數(shù)艾猜,而...則包括了任何想傳遞給FUN的參數(shù)买喧。其中,MARGIN=1
表示行匆赃,MARGIN=2
表示列淤毛。
apply()可把函數(shù)應(yīng)用到數(shù)組的某個(gè)維度上,而lapply()和sapply()則可將函數(shù)應(yīng)用到列表(list)上
5.2數(shù)據(jù)處理難題的一套解決方案
options(digits=2)
限定了輸出小數(shù)點(diǎn)后的數(shù)字位數(shù)算柳。
例子中由于數(shù)學(xué)低淡、科學(xué)和英語考試的分值不同(均值和標(biāo)準(zhǔn)差相去甚遠(yuǎn),在組合之前需要先讓它們變得可以比較瞬项。一種方法是將變量進(jìn)行標(biāo)準(zhǔn)化蔗蹋,這樣每科考試的成績(jī)就都是用單位標(biāo)準(zhǔn)差來表示,而不是以原始的尺度來表示了囱淋。這個(gè)過程可以使用scale()函數(shù)來實(shí)現(xiàn)猪杭。
數(shù)據(jù)框創(chuàng)建變量dataframe$var
fristname<-sapply(name,"[",1)
提取每個(gè)列表中的每個(gè)成分的第一個(gè)元素。
5.3控制流
R程序中的語句是從上至下順序執(zhí)行的妥衣。但有時(shí)你可能希望重復(fù)執(zhí)行某些語句胁孙,僅在滿足特定條件的情況下執(zhí)行另外的語句。這就是控制流結(jié)構(gòu)發(fā)揮作用的地方了称鳞。
為了理解貫穿本節(jié)的語法示例,請(qǐng)牢記以下概念:
語句(statement):是一條單獨(dú)的R語句或一組復(fù)合語句(包含在花括號(hào){}中的一組R語句稠鼻,使用分號(hào)分隔)
條件(cond):是一條被解釋為真(TRUE)或者假(FALSE)的表達(dá)式
表達(dá)式(expr):是一條數(shù)值或者字符串的求值語句
序列(seq):是一個(gè)數(shù)值或字符串序列
5.3.1重復(fù)和循環(huán)
循環(huán)結(jié)構(gòu)重復(fù)地執(zhí)行一個(gè)或一系列語句冈止,直到某個(gè)條件不為真為止。循環(huán)結(jié)構(gòu)包括for
和while
結(jié)構(gòu)
1.for結(jié)構(gòu)
for循環(huán)重復(fù)地執(zhí)行一個(gè)語句候齿,直到某個(gè)變量的值不再包含在序列seq中為止熙暴。語法為:
for (var in seq) statement
#單詞Hello被輸出了10次
for(i in 1:10) print("hello")
2.while結(jié)構(gòu)
while循環(huán)重復(fù)地執(zhí)行一個(gè)語句,直到條件不為真為止慌盯。語法為:
while(cond) statement
i<-10
#請(qǐng)確保括號(hào)內(nèi)while的條件語句能夠改變周霉,即讓它在某個(gè)時(shí)刻不再為真——否則循環(huán)將永不停止
while(i>0) {print("hello");i<-i+1}
5.3.2條件執(zhí)行
在條件執(zhí)行結(jié)構(gòu)中,一條或一組語句僅在滿足一個(gè)指定的條件時(shí)執(zhí)行亚皂。條件執(zhí)行結(jié)構(gòu)包括if-else俱箱、ifelse、switch灭必。
1狞谱、if-else結(jié)構(gòu)
控制結(jié)構(gòu)if-else在某個(gè)給定條件為真時(shí)執(zhí)行語句乃摹。也可以同時(shí)在條件為假時(shí)執(zhí)行另外的語句。語法為:
if (cond) statement
if (cond) statement1 else statement2
if (is.character(grade)) grade <- as.factor(grade)
#在第一個(gè)實(shí)例中跟衅,如果grade是一個(gè)字符向量孵睬,它就會(huì)被轉(zhuǎn)換為一個(gè)因子
2、ifelse結(jié)構(gòu)
ifelse結(jié)構(gòu)是if-else結(jié)構(gòu)比較緊湊的向量化版本伶跷,其語法為:ifelse(cond,statement1,statement2)
若cond為TRUE掰读,則執(zhí)行第一個(gè)語句;若cond為FALSE叭莫,則執(zhí)行第二個(gè)語句蹈集。
felse(score > 0.5,print("passed")食寡,print("Failed"))
3雾狈、switch結(jié)構(gòu)
switch根據(jù)一個(gè)表達(dá)式的值選擇語句執(zhí)行。語法為:
switch(expr,...)
其中的...表示與expr的各種可能輸出值綁定的語句抵皱。
5.4用戶自編函數(shù)
R語言最大優(yōu)點(diǎn)之一就是用戶可以自行添加的函數(shù)善榛。
myfunction<-function(arg1,arg2,...){
statements
return(object)
}
函數(shù)中的對(duì)象只在函數(shù)內(nèi)部使用。返回對(duì)象的數(shù)據(jù)類型是任意的呻畸,從標(biāo)量到列表皆可移盆。
有若干函數(shù)可以用來添加錯(cuò)誤捕獲和糾正功能。你可以使用函數(shù)warning()來生成一條錯(cuò)誤提示信息伤为,用message()來生成一條診斷信息咒循,或用stop()停止當(dāng)前表達(dá)式的執(zhí)行并提示錯(cuò)誤。
Note 一旦開始編寫無論任何長(zhǎng)度和復(fù)雜度的函數(shù)绞愚,優(yōu)秀調(diào)試工具的重要性都會(huì)凸顯出來叙甸。R中有許多實(shí)用的內(nèi)建調(diào)試函數(shù),也有許多用戶貢獻(xiàn)包提供了額外的功能位衩。關(guān)于這個(gè)話題裆蒸,一份優(yōu)秀的參考資料是Duncan Murdoch整理的Debugging in R.
5.5整合與重構(gòu)
R中提供了許多用來整合(aggregate)和重塑(reshape)數(shù)據(jù)的強(qiáng)大方法。
5.5.1轉(zhuǎn)置
使用一個(gè)函數(shù)t()
即可對(duì)一個(gè)矩陣或數(shù)據(jù)框進(jìn)行轉(zhuǎn)置糖驴。
5.5.2整合數(shù)據(jù)
在R中使用一個(gè)或多個(gè)by
變量和一個(gè)預(yù)先定義好的函數(shù)來折疊(collapse)數(shù)據(jù)是比較容易的僚祷。aggregate(x,by,Fun)
其中x是待折疊的數(shù)據(jù)對(duì)象,by是一個(gè)變量名組成的列表贮缕,這些變量將被去掉以形成新的觀測(cè)辙谜,而FUN則是用來計(jì)算描述性統(tǒng)計(jì)量的標(biāo)量函數(shù),它將被用來計(jì)算新觀測(cè)中的值感昼。
5.5.3reshape包
reshape包①是一套重構(gòu)和整合數(shù)據(jù)集的絕妙的萬能工具装哆。
5.5.3.1融合
melt()
函數(shù)
5.5.3.2重鑄
cast()
函數(shù)讀取已融合的數(shù)據(jù),并使用你提供的公式和一個(gè)(可選的)用于整合數(shù)據(jù)的函數(shù)將其重塑。調(diào)用格式為:newdata<-cast(md,formula,FUN)
其中的md為已融合的數(shù)據(jù)烂琴,formula描述了想要的最后結(jié)果爹殊,而FUN是(可選的)數(shù)據(jù)整合函數(shù)。
5.6總結(jié)
學(xué)習(xí)了控制流結(jié)構(gòu)的使用方法:用循環(huán)重復(fù)執(zhí)行某些語句奸绷,或用分支在滿足某些特定條件時(shí)執(zhí)行另外的語句梗夸。我們探索了折疊、整合以及重構(gòu)數(shù)據(jù)的多種方法号醉。