- R數(shù)據(jù)挖掘?qū)崙?zhàn)
- (意)安德烈亞·奇里洛
- 3222字
- 2024-05-24 17:51:21
1.6 R語言的劣勢以及如何克服這些劣勢
在與經(jīng)驗豐富的技術(shù)人員討論R語言時,技術(shù)人員通常會指出該語言存在的兩大劣勢。
● 陡峭的學(xué)習(xí)曲線。
● 難以處理大型數(shù)據(jù)集。
上述兩個劣勢確實是這門語言的兩大缺點。本書作者不會刻意地美化R語言,而是給出克服這些劣勢的方法。事實上,可以認(rèn)為第一大劣勢是暫時性的,至少針對不同個體是這樣的。因為讀者一旦邁過了R語言學(xué)習(xí)的“絕望谷”,就再也不會被這一劣勢所困擾。什么是絕望谷呢?此處用圖1-11來進(jìn)行說明。

圖1-11
眾所周知,個體在學(xué)習(xí)全新且足夠復(fù)雜的事物的過程中,都會經(jīng)歷3個階段。
● 蜜月期:在這個階段,學(xué)習(xí)者會喜歡上這樣的新事物,并且非常有信心能夠掌握它。
● 絕望谷:在這個階段,所有事情都變得困難重重,讓人陷入絕望。
● 接下來的階段:學(xué)習(xí)者開始對新事物有更深入的理解,對它的掌控能力提高,自信心也越來越強(qiáng)。
在談到第二大劣勢時,不得不說,R語言在處理大型數(shù)據(jù)集方面存在的困難實際上是這門語言本身具有的結(jié)構(gòu)性問題。因此需要在結(jié)構(gòu)上對其做出一些改變,需要將其與其他工具進(jìn)行戰(zhàn)略性合作。在1.6.1節(jié)和1.6.2節(jié)中,將針對這兩大劣勢進(jìn)行更加詳細(xì)的討論。
1.6.1 高效學(xué)習(xí)R語言,最小化精力投入
首先,R語言為什么會被視為一門很難學(xué)的語言呢?對于這個問題,沒有一個普遍統(tǒng)一的答案,不過可以嘗試推理一下其中的原因。R語言通常是進(jìn)行數(shù)據(jù)分析的首選語言,它是從事數(shù)據(jù)統(tǒng)計的人員為他們自己,尤其是學(xué)習(xí)數(shù)據(jù)統(tǒng)計的學(xué)生創(chuàng)建的一門語言。這就決定了這門語言的兩大特點。
● R語言沒有很好地考慮編程體驗。
● R語言具有其他語言所沒有的統(tǒng)計技術(shù),并且具有前所未有的創(chuàng)新的交互方式。
大家可以找到R語言學(xué)習(xí)曲線陡峭的原因,具體歸納如下。首先,相較于Julia和Swift這樣的語言,R語言并不是一個對程序員友好的語言。正如1.2節(jié)所提到的,R語言是誕生于學(xué)術(shù)領(lǐng)域的一種工具。其創(chuàng)造者可能也沒有想到,如今R語言可以被用于開發(fā)網(wǎng)站(更多內(nèi)容請見第13章,看一看這個令人眼前一亮的應(yīng)用)。
其次,學(xué)習(xí)過其他統(tǒng)計語言的人學(xué)習(xí)R語言時,會有一種暈頭轉(zhuǎn)向的感覺。在R語言中應(yīng)用數(shù)據(jù)模型時,會體驗到一種令人驚艷的交互過程:讀者將數(shù)據(jù)輸入模型,得到結(jié)果,并對結(jié)果進(jìn)行分析判斷;然后迭代執(zhí)行上述過程,或者進(jìn)行交叉驗證。在該過程中,所有的操作都具有非常高的靈活性。這完全不是統(tǒng)計分析系統(tǒng)(SAS)和統(tǒng)計分析軟件(SPSS)的用戶所能夠體驗到的。在SAS及SPSS中,用戶只能將數(shù)據(jù)提交給執(zhí)行函數(shù),然后得到一個大而全的結(jié)果集。
這就是最終結(jié)論了?難道只能被動接受歷史原因所導(dǎo)致的陡峭的R語言學(xué)習(xí)曲線嗎?當(dāng)然不是。實際上,R語言社區(qū)一直在積極地參與平緩這條曲線的工作,主要的工作內(nèi)容有以下兩點。
● 改善R語言的編程體驗。
● 編寫高質(zhì)量的學(xué)習(xí)資料。
1.tidyverse程序包
現(xiàn)如今在談?wù)揜語言的時候,一定會提到tidyverse程序包,因為tidyverse程序包在R社區(qū)中非常流行。tidyverse是由哈德利·威克姆開發(fā)的一個框架,該框架包含很多概念和函數(shù)。由于tidyverse程序包的存在,使用R語言的編程體驗更加貼近現(xiàn)代的編程體驗。有關(guān)tidyverse程序包的介紹已經(jīng)超出了本書的范圍,但是本書作者還是想簡單地介紹一下這個框架的組成部分,它通常至少包含以下4個程序包。
● reader:用于數(shù)據(jù)導(dǎo)入。
● dplyr:用于數(shù)據(jù)操作。
● tidyr:用于數(shù)據(jù)清洗。
● ggplot2:用于數(shù)據(jù)可視化。
tidyverse取得了很大的成功,因此出現(xiàn)了很多關(guān)于tidyverse主題的學(xué)習(xí)資料。在后文中,將介紹這些學(xué)習(xí)資料。
2.利用R語言社區(qū)來學(xué)習(xí)R語言
R語言最令人欣賞的特點之一就是它擁有一個生機(jī)勃勃的社區(qū)。起初,R語言社區(qū)主要由在其研究過程中偶遇R語言這一強(qiáng)大工具的統(tǒng)計人員和學(xué)術(shù)研究人員組成。如今,除了統(tǒng)計人員和學(xué)術(shù)研究人員,其他領(lǐng)域的專業(yè)人士也紛紛加入了R語言社區(qū),包括金融學(xué)、化學(xué)及遺傳學(xué)等領(lǐng)域。對于每個初學(xué)者來說,R語言社區(qū)都是一筆巨大的“財富”,社區(qū)中的人都非常友好且樂于幫助初學(xué)者邁出學(xué)習(xí)這門語言的第一步。但是讀者可能會感到疑惑,要如何利用R語言社區(qū)呢?答案是,首先要找到這個社區(qū)并體驗它;接下來要做的就是,看看如何利用社區(qū)主導(dǎo)的內(nèi)容來切實可行地學(xué)習(xí)R語言。
(1)如何找到R語言社區(qū)
R語言社區(qū)存在很多種交流方式(包括各種線上和線下方式),要與R語言社區(qū)進(jìn)行交流,可以通過其中的任意一種方式。下面列出的是部分線上和線下方式。
線上方式:
● R-bloggers。
● Twitter主題標(biāo)簽#rstats。
● Google+社區(qū)。
● Stack Overflow上被標(biāo)記了R的問題。
● R-help郵件列表。
線下方式:
● R語言年度研討會。
● RStudio開發(fā)者大會。
● R線下聚會。
(2)通過與R語言社區(qū)互動來學(xué)習(xí)R語言
既然已經(jīng)知道如何找到R語言社區(qū),那么接下來就看看如何利用社區(qū)進(jìn)行學(xué)習(xí)。通常有3種可選的方式(非單選)。
● 查閱社區(qū)主導(dǎo)的學(xué)習(xí)資料。
● 向社區(qū)尋求幫助。
● 及時跟進(jìn)R語言的最新進(jìn)展。
查閱社區(qū)主導(dǎo)的學(xué)習(xí)資料:學(xué)習(xí)資料主要有以下兩種。
● 論文、手冊和圖書。
● 在線交互式課程。
論文、手冊和圖書:雖然這種學(xué)習(xí)資料是比較傳統(tǒng)的,但讀者不應(yīng)因此而忽視它們,因為這些學(xué)習(xí)資料總是能夠讓讀者對所探討的問題獲得更加結(jié)構(gòu)性而且系統(tǒng)性的理解。讀者也可以在網(wǎng)絡(luò)上找到論文、手冊和圖書形式的資料。
向讀者推薦以下比較有幫助的期刊和圖書。
● Advanced R。
● R for Data Science。
● An Introduction to Statistical Learning。
● OpenIntro Statistics。
● The R Journal。
在線交互式課程:這類課程應(yīng)該是當(dāng)前非常常見的學(xué)習(xí)資料了。在很多不同的平臺上都能找到非常不錯的R語言學(xué)習(xí)資料,其中知名的可能是DataCamp、Udemy和Packt。這些平臺上分享的是一種實用的交互方式,讀者可以通過練習(xí)和實踐,直接掌握相關(guān)的主題知識,而不是被動地看著別人解釋復(fù)雜的理論。
向社區(qū)尋求幫助:當(dāng)開始編寫第一行R語言代碼時(甚至在編寫代碼之前),讀者可能會遇到一些與編碼工作相關(guān)的問題。在這種情況下,最好的方法就是向社區(qū)求助,在社區(qū)的幫助下解決這些問題。讀者很可能并不是第一個提出相關(guān)問題的人。所以,在提出問題之前,可以先在網(wǎng)上尋找一下之前是否有人提出過類似的問題,并查看問題答案。
應(yīng)該在哪里尋找答案呢?在大部分情況下,讀者可以通過以下幾處找到答案(按可能找到答案的概率先后列出)。
● Stack Overflow。
● R-help郵件列表。
● R程序包的文檔。
但是,不建議讀者在社交網(wǎng)絡(luò)或者其他類似網(wǎng)站上尋找答案,因為它們并不是專注于處理這類問題的網(wǎng)站。在這些網(wǎng)站上,答案沒有經(jīng)過任何專業(yè)的審核,因此,在這類網(wǎng)站上查找到的答案可能是過時的,或者根本就是不正確的。
如果讀者提出的是一個從未有人問到過的新問題,那么讀者可以在前面尋找問題答案的地方進(jìn)行提問。
及時跟進(jìn)R語言的最新進(jìn)展:由于存在很多熱心用戶的貢獻(xiàn),R語言的世界才得以不斷更新、不斷進(jìn)步。如何緊跟這些變化呢?社交網(wǎng)絡(luò)可以派上用場。通過關(guān)注社交網(wǎng)絡(luò)或者類似網(wǎng)站的#rstats主題標(biāo)簽,讀者就可以不斷地了解R語言的動態(tài)。另外,還可以在R-bloggers上訂閱每日新聞,這些新聞是由前一天發(fā)布的與R語言相關(guān)的博客文章組成的,都很實用。最后,讀者可以通過R語言年度研討會或者類似會議接觸到著名的R專家,聽取他們的獨(dú)特見解,以及他們關(guān)于R語言未來發(fā)展的演講。
1.6.2 使用R語言操作大型數(shù)據(jù)集
前面提到,R語言的第二大劣勢與大型數(shù)據(jù)集的處理有關(guān)。那么,這個劣勢來自哪里呢?實際上,這個劣勢與R語言的核心機(jī)制有關(guān),R語言是一個內(nèi)存軟件。也就是說,在R語言腳本中創(chuàng)建和管理的每一個對象都存儲在計算機(jī)的RAM中。這意味著數(shù)據(jù)的總大小不能超過RAM的總大?。ㄇ疤崾瞧渌浖]有占用RAM,但這是不切實際的)。那么,如何克服這個劣勢呢?答案實際上超出了本書所要講解的范圍。盡管如此,作者在此簡單地總結(jié)出3種應(yīng)對策略。
● 優(yōu)化代碼,使用profvis等程序包對代碼進(jìn)行分析,并遵循R語言編程最佳實踐。
● 使用外部數(shù)據(jù)存儲和整理工具,如Spark、MongoDB和Hadoop。在后文中,會對此做進(jìn)一步介紹。
● 使用ff、filehash、R.huge或者bigmemory等程序包來改變R語言內(nèi)存處理行為,以盡量避免內(nèi)存過載。
作為作者,我想要強(qiáng)調(diào)的是,這個劣勢實際上是可以克服的。對于剛剛開始R語言學(xué)習(xí)之旅的初學(xué)者,在遇到這個劣勢時不必?fù)?dān)心。
最后補(bǔ)充說明:隨著獲取計算能力的成本越來越低,與大型數(shù)據(jù)集處理相關(guān)的問題就會顯得越來越微不足道。
- GitHub Essentials
- Microsoft SQL Server企業(yè)級平臺管理實踐
- 虛擬化與云計算
- Oracle RAC 11g實戰(zhàn)指南
- 基于Apache CXF構(gòu)建SOA應(yīng)用
- 數(shù)亦有道:Python數(shù)據(jù)科學(xué)指南
- Spark大數(shù)據(jù)分析實戰(zhàn)
- The Game Jam Survival Guide
- 數(shù)據(jù)庫技術(shù)實用教程
- 從0到1:JavaScript 快速上手
- 大數(shù)據(jù)分析:數(shù)據(jù)倉庫項目實戰(zhàn)
- 數(shù)據(jù)分析師養(yǎng)成寶典
- 云計算寶典:技術(shù)與實踐
- Node.js High Performance
- 數(shù)據(jù)分析思維:產(chǎn)品經(jīng)理的成長筆記