第五章 高級(jí)數(shù)據(jù)管理

聚類分析可視化演训,趙方慶發(fā)表論文中的圖

本章節(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)
學(xué)生數(shù)據(jù)

5.2 數(shù)值和字符處理函數(shù)

5.2.1 數(shù)學(xué)函數(shù)

數(shù)學(xué)函數(shù)1
數(shù)學(xué)函數(shù)2

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é)方差矩陣)冲呢,例如:
給定的均值和相關(guān)矩陣
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)。

字符處理函數(shù)1
字符處理函數(shù)2

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ù)值或字符串序列务蝠。
  1. 重復(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ù)梯影。

  1. 條件執(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) statementif (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)

  1. 轉(zhuǎn)置:是重塑數(shù)據(jù)集的總舵方法中最簡(jiǎn)單的一個(gè),使用函數(shù)t()即可對(duì)一個(gè)矩陣或數(shù)據(jù)框進(jìn)行轉(zhuǎn)置弛房。對(duì)于后者道盏,行名將成為變量。
  2. 整合數(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è)中的值伟葫。
  3. 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)建
原始數(shù)據(jù)
  • 重鑄 :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ǔ)部分依啰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乎串,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子速警,更是在濱河造成了極大的恐慌叹誉,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闷旧,死亡現(xiàn)場(chǎng)離奇詭異长豁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鸠匀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蕉斜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事宅此』恚” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵父腕,是天一觀的道長(zhǎng)弱匪。 經(jīng)常有香客問我,道長(zhǎng)璧亮,這世上最難降的妖魔是什么萧诫? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮枝嘶,結(jié)果婚禮上帘饶,老公的妹妹穿的比我還像新娘。我一直安慰自己群扶,他們只是感情好及刻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竞阐,像睡著了一般缴饭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骆莹,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天颗搂,我揣著相機(jī)與錄音,去河邊找鬼幕垦。 笑死丢氢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的智嚷。 我是一名探鬼主播卖丸,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盏道!你這毒婦竟也來了稍浆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤猜嘱,失蹤者是張志新(化名)和其女友劉穎衅枫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朗伶,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弦撩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了论皆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片益楼。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猾漫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出感凤,到底是詐尸還是另有隱情悯周,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布陪竿,位于F島的核電站禽翼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏族跛。R本人自食惡果不足惜闰挡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望礁哄。 院中可真熱鬧长酗,春花似錦、人聲如沸桐绒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掏膏。三九已至,卻和暖如春敦锌,著一層夾襖步出監(jiān)牢的瞬間馒疹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工乙墙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颖变,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓听想,卻偏偏與公主長(zhǎng)得像腥刹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汉买,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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