
如何高效地學(xué)好R語言?
第一階段有一點(diǎn):基礎(chǔ)的文件操作(read.*, write.*)、數(shù)據(jù)結(jié)構(gòu)知識(shí),認(rèn)識(shí)什么是數(shù)據(jù)框(data.frame)、列表(list)、矩陣(matrix)、向量(vector),如何提取(包括which, [ ]等)、置換(t, matrix等)、刪除(-, which等)、運(yùn)算(+, -, *, / , %%, %/%等)、轉(zhuǎn)換(as.*)、修改(edit, fix等)數(shù)據(jù)(包括單個(gè)數(shù)、行、列、表、變量),安裝包、調(diào)用包以及session的保存。完成這一階段,你就大致能像excel里處理數(shù)據(jù)一樣了。
第二階段有三點(diǎn):
1、學(xué)習(xí)統(tǒng)計(jì)。
這是貫穿整個(gè)R學(xué)習(xí)的最重要的一部,很多時(shí)候你并不是不知道在哪里找,怎么使用某個(gè)函數(shù)的參數(shù),更多的時(shí)候你是不知道某個(gè)統(tǒng)計(jì)方法的原理,所代表的意義甚至不知道該用什么方法。所以學(xué)習(xí)統(tǒng)計(jì)學(xué)知識(shí)往往才是學(xué)習(xí)R的關(guān)鍵,之后找函數(shù)、怎么用其實(shí)都是傻瓜式的,并不需要你從頭編寫算法。這部分內(nèi)容頁要結(jié)合每個(gè)人要做的事做。
2、批量處理。
由于R和matlab一樣,注重的是批量處理,而且R之中的循環(huán)往往效率極低,所以在R之中如果你發(fā)現(xiàn)你要使用雙層循環(huán)的時(shí)候,就要想想了,有沒有批量處理的方法。
a、首先,幾乎所有的R里的運(yùn)算符和自帶的函數(shù)都是可以批量處理的。比如向量a+向量b是指每個(gè)元素按照index相加,所以就沒必要for一下了;
b、其次,R自帶有的apply族函數(shù)(因?yàn)槭且幌盗幸詀pply結(jié)尾的函數(shù),所以稱為apply族),split,以及aggregate函數(shù)。這三類就是R自帶的批量處理的利器,學(xué)好這三類函數(shù),基本就可以完成絕大部分的數(shù)據(jù)批量處理了。
c、然后就是reshape2包以及plyr包了,這是批量處理的兩個(gè)利器,reshape主要是整形,plyr包基本提供了一套整理數(shù)據(jù)的理念,學(xué)好這兩個(gè)包,批量處理將事半功倍。
d、在實(shí)際過程中,一些for還是無法避免的。這時(shí)候就要考慮用別的語言來處理這部分事情了。比較常用的方法就是用別的語言批量生成R的代碼,還有就是直接用R調(diào)用別的語言處理的結(jié)果或者用別的語言調(diào)用R的處理結(jié)果。
3、繪圖系統(tǒng)。
總結(jié)而言,我們可以把R的繪圖系統(tǒng)分成四個(gè):Graphics,lattice,ggplot2以及grid。最好學(xué)習(xí)順序也是按照這個(gè)來。
a、自帶的繪圖系統(tǒng)
這套系統(tǒng)可以完成最基本的事情,其操作也類似于matlab,可以看做是分步驟命令參數(shù)式繪圖,基本就是將一系列作圖看做一步步的命令,每一句都干一件事,然后通過參數(shù)調(diào)整其中的某個(gè)元素的大小、位置、顏色。
b、lattice
繪圖邏輯也同上。只是加了分組繪圖、facet的功能,這些都很實(shí)用,其目的就是講自帶函數(shù)中需要大量預(yù)處理以及多步繪圖的命令用一行命令代替。上手也非常簡(jiǎn)單。
c、ggplot2
這是經(jīng)典的R繪圖包,繪圖哲學(xué)是圖層式的,理解成一個(gè)一個(gè)圖層的覆蓋。這個(gè)繪圖系統(tǒng)能做很多事,而且其自帶主題也相當(dāng)漂亮。有一定的學(xué)習(xí)難度。
以下就是我用ggplot畫的圖
grid繪圖系統(tǒng)算是最基元的繪圖命令,很多指令都是從畫圓、直線、矩形開始的,這算是R里最好理解但也是最復(fù)雜的繪圖系統(tǒng)。適合想入深坑的人士學(xué)習(xí),如果要自由創(chuàng)造一些新的圖形,或者編寫繪圖包,這是必學(xué)的繪圖系統(tǒng)。另一個(gè)值得說的就是grid中也有專門用來整理拼圖的指令,這個(gè)對(duì)于有一些論文拼圖需求的人來說還是學(xué)學(xué)比較好。
如果你完成了以上兩個(gè)階段,你已經(jīng)可以在工作學(xué)習(xí)中完成絕大部分的工作。但如果你是知識(shí)的創(chuàng)造者,或者是個(gè)程序員,或者是要實(shí)踐自己的算法、理論、統(tǒng)計(jì)方法、繪圖方法,或者亦或是你只是腦抽了,那就要進(jìn)入第三階段的學(xué)習(xí)。這部分包括,C語言掌握與精通、R語言調(diào)試、改進(jìn)、編寫包、寫一個(gè)地道的幫助文檔、推銷自己的想法。這一階段完成了,你也就是一個(gè)R語言的大牛了。少年到處是你可以施展拳腳的地方。
由以上內(nèi)容,可以基本上把學(xué)習(xí)路徑總結(jié)為下圖:
此外,其實(shí)R語言是一門輕編程重統(tǒng)計(jì)的語言,所以題主完全不需要擔(dān)心自己的編程基礎(chǔ)。直接做幾個(gè)小項(xiàng)目,你會(huì)很快上手,千萬不要從教材第一頁讀到最后一頁,那種效率極低,且容易半途而廢。
關(guān)于批處理的問題有幾位同僚在回復(fù)里面詢問批處理的問題,這里做個(gè)簡(jiǎn)單的解釋。
批處理類似于向量運(yùn)算,但也有很大差距,簡(jiǎn)單的說,是一個(gè)函數(shù)可以快速的套用到多維變量的每一維值中。
1. 自帶函數(shù)的批處理
譬如:
s <- 1:5
s * 2
這就是一個(gè)最簡(jiǎn)單的批處理的例子,結(jié)果是
2 4 6 8 10
這是一個(gè)簡(jiǎn)單的向量標(biāo)量積結(jié)果,而所謂的批處理也就是類似于這種處理方式。而在R之中,數(shù)據(jù)的最小單元其實(shí)就是向量,因此,幾乎所有R的函數(shù),都是批處理的。(注意,與matlab不同,matlab最小單元是矩陣,因此,其基本的運(yùn)算都是基于舉證運(yùn)算的)。
我們可以用以下方式定義批處理函數(shù):如果一個(gè)函數(shù)F,滿足,
且函數(shù)F的實(shí)現(xiàn)不基于任何顯式循環(huán)(諸如for,while, until),則函數(shù)F可以稱之為批處理函數(shù)。
譬如:plot(將兩個(gè)向量的對(duì)應(yīng)的數(shù)逐個(gè)地畫到圖中),paste(將字符串向量的每個(gè)字符串都做連接)等等。。。
這里比較一下會(huì)更加清楚,譬如如果在python里實(shí)現(xiàn)以上功能(不實(shí)用pandas和numpy包),就得采用顯式的循環(huán)(for,while等):
a = list(range(1, 6))a = [i * 2 for i in a]
因此,我們可以看出采用批處理最大的優(yōu)點(diǎn)在于減少的代碼量,并且更加簡(jiǎn)潔明了,易于維護(hù)。
2. 批處理是否更加高效
其實(shí)批處理的另一個(gè)好處就是使得運(yùn)行更加高效,因?yàn)榕幚砗瘮?shù)往往經(jīng)過處理(使用更好的算法或者更底層的實(shí)現(xiàn)方式)得到某種程度的提速。我們?cè)谶@里測(cè)試實(shí)現(xiàn)將向量每個(gè)元素都自乘2這一功能,分別采用按鍵替換,按數(shù)字索引替換以及直接批量處理的方式,來測(cè)試不同方式速度是如何的。
a <- 1:10
f1 <- function(x) {
for (i in x) {
x[which(x == i)] = i * 2
}
}
f2 <-function(x) {
for (i in 1:10) {
x[i] = x[i] * 2
}
}
f3 <- function(x) {
x = x * 2
}
system.time(replicate(100000, f1(a)))
system.time(replicate(100000, f2(a)))
system.time(replicate(100000, f3(a)))
結(jié)果如下:> system.time(replicate(100000, f1(a)))
用戶 系統(tǒng) 流逝
4.47 0.01 4.72
> system.time(replicate(100000, f2(a)))
用戶 系統(tǒng) 流逝
2.53 0.00 2.63
> system.time(replicate(100000, f3(a)))
用戶 系統(tǒng) 流逝
0.63 0.03 0.72
明顯看出,批處理并且避免顯式循環(huán)的方式的確有助于提高速度,代碼量也少的多。因此,何樂而不為呢?
但是經(jīng)過測(cè)試,并不是每個(gè)批處理函數(shù)的效果并不是都是那么明顯,譬如:strsplit。甚至研究碼源之后,你也會(huì)發(fā)現(xiàn),很多批處理常用的函數(shù)的實(shí)現(xiàn)其實(shí)都是for,因此,有一派觀點(diǎn)認(rèn)為避免顯式循環(huán)(特別是指采用apply函數(shù)、plyr包的方法避免顯式循環(huán)),其實(shí)具有一定的誤導(dǎo)性,其是否能提高效率也是要視情況而定。
3. apply族函數(shù)和aggregate函數(shù)
這是R基礎(chǔ)包自帶的兩類用于批量處理的函數(shù)包,在此,只做簡(jiǎn)單地介紹:
apply函數(shù)族共有五個(gè),分別是:apply,lapply,sapply,tapply,vapply。其總用其實(shí)就是將某個(gè)函數(shù)逐個(gè)套用到向量(矩陣)中每個(gè)元素之中,其實(shí)具體的作用,讀幫助文檔就可以了。
aggregate這個(gè)函數(shù)比較有意思,常用的帶入方式是:
aggregate(aDataFrame, by = list(vector1,vector2), FUN = aFunction)
作用就是基于by指定的變量做分組,計(jì)算FUN分別統(tǒng)計(jì)每個(gè)組的結(jié)果
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10