本章節(jié)主要是了解R中的多種數(shù)學(xué)庙楚、統(tǒng)計(jì)和字符處理函數(shù)失受;如何自己編寫函數(shù)來完成數(shù)據(jù)處理和分析任務(wù)很魂;數(shù)據(jù)的整合和概述方法以及數(shù)據(jù)集的重塑和重構(gòu)方法扎酷。
5.1 一個(gè)數(shù)據(jù)處理難題
在這個(gè)數(shù)據(jù)處理例子中,各科考試成績(jī)沒法直接比較遏匆,排序也困難等其他實(shí)際問題法挨。但可以利用R中的數(shù)值和字符處理函數(shù)來完成。
#先將數(shù)據(jù)導(dǎo)入到R語言
Student <- c("John Davis","Angela Williams","Bullwinkle Moose",
"David Jones","Janice Markhammer",
"Cheryl Cushing","Reuven Ytzrhak",
"Greg Knox","Joel England","Mary Rayburn")
math <- c(502, 600, 412, 358, 495, 512, 410, 625, 573, 522)
science <- c(95, 99, 80, 82, 75, 85, 80, 95, 89, 86)
english <- c(25, 22, 18, 15, 20, 28, 15, 30, 27, 18)
roster <- data.frame(Student, math, science, english,
stringsAsFactors=FALSE)
5.2 數(shù)值和字符處理函數(shù)
5.2.1 數(shù)學(xué)函數(shù)
5.2.2 統(tǒng)計(jì)函數(shù)
數(shù)據(jù)的標(biāo)準(zhǔn)化:默認(rèn)情況下幅聘,函數(shù)
scale()
對(duì)矩陣或數(shù)據(jù)框的指定列進(jìn)行均值為0凡纳、標(biāo)準(zhǔn)差為1的標(biāo)準(zhǔn)化:newdata <- scale(mydata)
。如果要對(duì)每一列進(jìn)行任意均值和標(biāo)準(zhǔn)差的標(biāo)準(zhǔn)化帝蒿,newdata <- scale(mydata)*SD+M
荐糜。此外,要對(duì)指定列進(jìn)行標(biāo)準(zhǔn)化,可以使用如下的代碼進(jìn)行:
newdata <- transform(mydata, myvar = scale(myvar)*10+50)
狞尔。
5.2.3 概率函數(shù)
- 設(shè)定隨機(jī)數(shù)種子
可以通過函數(shù)set.seed()
顯示指定這個(gè)種子丛版,讓結(jié)果可以重現(xiàn)。函數(shù)runif()
用來生成0-1區(qū)間上服從均勻分布的偽隨機(jī)數(shù)偏序。通過手動(dòng)設(shè)定種子,結(jié)果可以重現(xiàn)胖替,否則每次運(yùn)行都會(huì)產(chǎn)生不同的偽隨機(jī)數(shù)研儒。 - 生成多元正態(tài)數(shù)據(jù)
在模擬研究和蒙特卡洛方法中,你經(jīng)常需要獲取來自給定均值向量和協(xié)方差陣的多元正太分布的數(shù)據(jù)独令。MASS包中mvrnorm(n, mean, sigma)
可以很容易產(chǎn)生這樣的數(shù)據(jù)端朵。(n是樣本的大小,mean是均值向量燃箭,sigma是方差-協(xié)方差矩陣)冲呢,例如:
mean <- c(230.7, 146.7, 3.6)
sigma <- matrix( c(15360.8, 6721.2, -47.1,
6721.2, 4700.9, -16.5,
-47.1, -16.5, 0.3), nrow=3, ncol=3)
set.seed(1234)
mydata <- mvrnorm(500, mean, sigma)
mydata <- as.data.frame(mydata)
names(mydata) <- c("y", "x1", "x2")
dim(mydata)
head(mydata, n=10)
5.2.4 字符處理函數(shù)
可以從文本型數(shù)據(jù)中抽取信息,或者為打印輸出和生成報(bào)告重設(shè)文本的格式招狸。
函數(shù)grep()
, sub()
和strsplit()
能夠搜索某個(gè)文本字符串(fixed=TRUE)或某個(gè)正則表達(dá)(fixed=FALSE敬拓,默認(rèn)值為FALSE)。
5.2.5 其他使用函數(shù)
5.2.6 將函數(shù)應(yīng)用于矩陣和數(shù)據(jù)框
R函數(shù)的特性之一裙戏,就是他們可以應(yīng)用到一系列的數(shù)據(jù)對(duì)象上乘凸,包括標(biāo)量、向量累榜、矩陣营勤、數(shù)組和數(shù)據(jù)框的任何維度上。
a <- 5
sqrt(a)
b <- c(1.243, 5.654, 2.99)
round(b)
c <- matrix(runif(12), nrow=3)
c
log(c)
mean(c)
apply()
函數(shù)壹罚,可將一個(gè)任意函數(shù)應(yīng)用到矩陣葛作、數(shù)組、數(shù)據(jù)框的任何維度上猖凛。使用格式:apply(x, MARGIN, FUN, ...)
赂蠢,x為數(shù)據(jù)對(duì)象,MARGIN是維度的下標(biāo)形病,F(xiàn)UN是由你指定的函數(shù)客年,而...則包括了任何想傳遞給FUN的參數(shù)。在矩陣或數(shù)據(jù)框中漠吻,MARGIN=1表示行量瓜,MARGIN=2表示列。
mydata <- matrix(rnorm(30), nrow=6)
mydata
apply(mydata, 1, mean)
apply(mydata, 2, mean)
apply(mydata, 2, mean, trim=.4)
5.3 數(shù)據(jù)處理難題的一套解決方案
# 限定了輸出小數(shù)點(diǎn)后數(shù)字的位數(shù)
options(digits=2)
# 構(gòu)建數(shù)據(jù)框
Student <- c("John Davis", "Angela Williams", "Bullwinkle Moose",
"David Jones", "Janice Markhammer", "Cheryl Cushing",
"Reuven Ytzrhak", "Greg Knox", "Joel England",
"Mary Rayburn")
Math <- c(502, 600, 412, 358, 495, 512, 410, 625, 573, 522)
Science <- c(95, 99, 80, 82, 75, 85, 80, 95, 89, 86)
English <- c(25, 22, 18, 15, 20, 28, 15, 30, 27, 18)
roster <- data.frame(Student, Math, Science, English,
stringsAsFactors=FALSE)
# 將每科考試成績(jī)用單位標(biāo)準(zhǔn)差來表示途乃,而不是以原始的尺度來表示绍傲。
z <- scale(roster[,2:4])
# 并將z來計(jì)算各行的均值以獲得綜合得分
score <- apply(z, 1, mean)
# 使用cbind函數(shù)將score添加到數(shù)據(jù)框中
roster <- cbind(roster, score)
# 使用quantile函數(shù)將score分為5個(gè)部分
y <- quantile(roster$score, c(.8,.6,.4,.2))
# 通過使用邏輯運(yùn)算符,可以將百分?jǐn)?shù)排名重編碼為一個(gè)新的成績(jī)變量grade,分為5個(gè)等級(jí)A烫饼、B猎塞、C、D杠纵、F
roster$grade[score >= y[1]] <- "A"
roster$grade[score < y[1] & score >= y[2]] <- "B"
roster$grade[score < y[2] & score >= y[3]] <- "C"
roster$grade[score < y[3] & score >= y[4]] <- "D"
roster$grade[score < y[4]] <- "F"
# 使用函數(shù)strsplit()以空格為界荠耽,將學(xué)生的姓名拆分開。
name <- strsplit((roster$Student), " ")
# 使用函數(shù)sapply()提取列表中每個(gè)成分的第一個(gè)和第二個(gè)分別放入兩個(gè)向量中比藻÷亮浚“[” 是一個(gè)可以提取某個(gè)對(duì)象的一部分函數(shù)
Lastname <- sapply(name, "[", 2)
Firstname <- sapply(name, "[", 1)
roster <- cbind(Firstname,Lastname, roster[,-1])
# 重新排列順序
roster <- roster[order(Lastname,Firstname),]
5.4 控制流
- 語句(statement):是一條單獨(dú)的R語言或一組符合語句(包含在花括號(hào)中的一組R語句,使用分好分隔)银亲;
- 條件(cond):是一條最終被解析為真(TRUE)或假(FALSE)的表達(dá)式慢叨;
- 表達(dá)式(expr):是一條數(shù)值或字符串的求值語句;
- 序列(seq):是一個(gè)數(shù)值或字符串序列务蝠。
- 重復(fù)和循環(huán)
- for 結(jié)構(gòu):重復(fù)地執(zhí)行一個(gè)語句拍谐,直到某個(gè)變量的值不再包含在序列seq中為止。語法:
for (var in seq)statement
馏段。 - while 循環(huán)重復(fù)地執(zhí)行一個(gè)語句轩拨,直到條件不為真為止。語法為:
while (cond)statement
毅弧。while結(jié)構(gòu)可能很危險(xiǎn)气嫁,一旦cond條件一直不變?yōu)檎妫敲淳蜔o線循環(huán)够坐。
處理大數(shù)據(jù)集中的行和列時(shí)寸宵,R中的循環(huán)可能效率比較低。只要可能元咙,最好聯(lián)用R中的內(nèi)建數(shù)值/字符處理函數(shù)和apply()族函數(shù)梯影。
- 條件執(zhí)行:在條件執(zhí)行結(jié)構(gòu)中,一條或一組語句僅在滿足一個(gè)指定條件時(shí)執(zhí)行庶香。包括if-else甲棍、ifelse和switch。
- if-else結(jié)構(gòu):控制結(jié)構(gòu)if-else在某個(gè)給定條件為真時(shí)執(zhí)行語句赶掖。也可以同時(shí)在條件為假時(shí)執(zhí)行另外的語句感猛。語法:
if(cond) statement
或if (cond) statement1 else statement2
。 - ifelse結(jié)構(gòu):是if-else結(jié)構(gòu)比較緊湊的向量化版本奢赂。語法:
ifelse(cond, statement1, statement2)
陪白。 - switch結(jié)構(gòu):是一個(gè)根據(jù)表達(dá)式的值選擇語句執(zhí)行的循環(huán)結(jié)構(gòu)。
語法:switch(expr, ...)
膳灶,其中的...表示與expr的各種可能輸出值綁定的語句咱士。下面的例子很好的闡釋了switch的主要功能立由。
feelings <- c("sad", "afraid")
for (i in feelings)
print(
switch(i,
happy = "I am glad you are happy",
afraid = "There is nothing to fear",
sad = "Cheer up",
angry = "Calm down now"
)
)
5.5 用戶自編函數(shù)
一個(gè)函數(shù)的結(jié)構(gòu)看起來大致如此:
myfunction <- function(arg1, arg2, ...){
statements
return(object)
}
函數(shù)中的對(duì)象只在函數(shù)內(nèi)部使用。返回對(duì)象的數(shù)據(jù)類型是任意的序厉,從標(biāo)量到列表都可以锐膜。
5.6 整合與重構(gòu)
- 轉(zhuǎn)置:是重塑數(shù)據(jù)集的總舵方法中最簡(jiǎn)單的一個(gè),使用函數(shù)
t()
即可對(duì)一個(gè)矩陣或數(shù)據(jù)框進(jìn)行轉(zhuǎn)置弛房。對(duì)于后者道盏,行名將成為變量。 - 整合數(shù)據(jù):在R中使用一個(gè)或多個(gè)by變量和一個(gè)預(yù)先預(yù)定好的函數(shù)來折疊數(shù)據(jù)是比較容易的庭再。格式:
aggregate(x, by, FUN)
捞奕,x是待折疊的數(shù)據(jù)對(duì)象,by是一個(gè)變量名組成的列表拄轻,F(xiàn)UN是用來計(jì)算描述性統(tǒng)計(jì)量的標(biāo)量函數(shù),將被用來計(jì)算新觀測(cè)中的值伟葫。 - reshape2 包:是一套重構(gòu)和整合數(shù)據(jù)集的絕對(duì)的萬能工具恨搓。大致就是先將數(shù)據(jù)融合(melt),以使每一行都是唯一的標(biāo)識(shí)符-變量組合筏养。然后將數(shù)據(jù)重鑄(cast)為你想要的任何形狀斧抱。
- 融合數(shù)據(jù):
md <- melt(mydata, id = c("ID", "Time"))
必須指定要唯一確定每個(gè)測(cè)量所需的變量(ID和Time),而表示測(cè)量變量名的變量由程序自動(dòng)創(chuàng)建
- 重鑄 :
dcast()
函數(shù)讀取已融合的數(shù)據(jù)渐溶,并使用你提供的公式和一個(gè)(可選的)用于整合數(shù)據(jù)的函數(shù)將其重塑辉浦。
格式:newdata <- dcast(md, formula, fun.aggregate)
,md為已經(jīng)融合數(shù)據(jù)茎辐,formula描述了想要的結(jié)果宪郊,而最后的參數(shù)是數(shù)據(jù)整合函數(shù)。
PS:國(guó)慶也結(jié)束了拖陆,終于將第一部分入門的知識(shí)學(xué)習(xí)了一遍弛槐。明天或許要下個(gè)禮拜才能夠進(jìn)入下一部分的學(xué)習(xí),進(jìn)入基礎(chǔ)部分依啰。