如何在 R 中高效快捷地處理大量數據?
題主大二統計狗,由於Project需要,經常會涉及到幾百萬甚至幾千萬條數據的處理(包括簡單的summary,分類plot還有一些regression什麼的)
電腦已經是i7處理器,16G內存了,可是使用R操作依然很卡,經常閃退或沒反應(點terminate就是顯示要強行終結)。經常read或者write一個file就要十多分鐘,曾經Plot一個散點圖卡了整整20分鐘。 。。本人已經熟練使用各種apply,ggplot, dateframe,dplyr等。想請教知乎上各位大神,有沒有比較快捷的方法或者package可以高效快捷的處理這種量級的數據?(原諒我表述不清。。。就是任何可以幫助的東西,技巧也好,思維也好,package也行,都請您不吝賜教)謝謝!^_^ 附相關問題:如何編寫高效的 R 語言程序? - 編程語言
1. readr package, 幾乎包裝了 ff 包,比 ff 包操作簡單多了(和正常讀寫的函數名幾乎一致),好上手,效率提升特別快。2. 能 read by line 就不要 read by frame。3. 避免 loop,多用矩陣運算(不只是R)。4. bigmemory 包依然有用。
5. 並行的話,可以參考這篇R並行學習筆記 和 這篇http://yixuan.cos.name/cn/2013/06/documentation-on-parallel-R/
讀入和整理數據的話多用data.table吧。剛剛用fread讀了個上千萬的csv文件,這個讀入速度我完全能接受吧,而且每一列數據的屬性都guess的很正確啊。
&> system.time(DT &<- fread("201403-201406_with_tv_market.csv"))
Read 16221666 rows and 29 (of 29) columns from 5.380 GB file in 00:02:30
user system elapsed
137.17 3.48 149.70
接下來,如果不喜歡用data.table的語法整理數據,可以用data.table做為backend,用dplyr來整理data.table格式的數據框。速度當然就沒有用data.table語法的快了。另外stackoverflow上有關於如何用R快速讀入大量數據的討論,很值得一看:import - Quickly reading very large tables as dataframes in R
前幾天參加了R會議,正好又得到了一些知識儲備外的信息,現補充上來。
普渡大學的劉傳海教授正在編寫一個支持多線程和分散式計算的包:SupR,目前還沒正式發布。尹志老師推薦data.table包,適應用於GB級的中型數據,數據級別又沒有大到用Hadoop,適合學生參加數據科學比賽。——————————————————————
想到了以下四個方法可以供題主參考:
考慮用sql儲存數據,需要的時候部分讀取。
還有ff,bigmemory包等可以把數據存在內存之外,需要時部分讀取。r是單核運算的,可以考慮用parallel包多核運算。最後,覺得上千萬條數據sas比r快多了,可以在sas里做預處理,在r裡面做分析。END
上千萬的數據,我也用R處理過,的確很卡,考慮換語言或者用資料庫存儲吧可以考慮用data.table包和ff包試試,應付一般的數據處理不要用R的apply系列,效率其實不夠高,建議用plyr包,可以並行計算幾千萬行的數據,就不要全數據散點圖了……你可以抽樣,反正都是密密麻麻的點summary的效率很低,數據集太大,還是不要對整個數據集使用
用python的pandas吧......這個數據量真的沒辦法再優化了
果斷sparkR
可以嘗試使用雲平台,也就是這個在線分析工具,知道的人不多R數據分析暨導引系統 (需要用chrome瀏覽器,或者Foxfire瀏覽器或者搜狗高速瀏覽器,總之谷歌內核的就行)能處理十億筆數據,還有數據挖掘模塊
請用資料庫儲存和整理大量數據,分析可以R。要用正確的工具處理對應的問題。sqlite mysql 什麼的都可以。python 到這個數量級也上資料庫了。要不自己蠻幹也行,像spark 土豪上RDD唄。
在正常情況下能使用R處理這樣大數據量已經接近極限了。接下來使用Python會是比較好的選擇。如果是windows系統的話,程序包從WinPython上手會比較方便,集成了大多數常用的python的科學計算包,而且有spyder界面,和matlab、Rstudio界面很相似
書的話推薦Mark Lutz的Learning python和Wes McKinney的Python for data analysis,有了R的基礎,python和科學計算包的相關語法應該可以很快上手,祝學習順利!~
data.table 處理數據的速度還是能接受的
如果數據稀疏可以考慮用稀疏結構存儲,例如調用SparseM之類,也有很多常用的package兼容稀疏存儲結構,例如e1071或者glmnet之類,基本分析還是可以做的。
當然如果數據非稀疏結構還是建議別用R了,如果只是做做回歸什麼的,隨便拿底層語言寫幾個函數,也比考慮怎麼把數據load進R要省力的多。用向量計算別用for循環載入的數據比你的內存小Romp利用第二個核
revolutionaryR
r在處理100M以上的數據時就有點力不從心了,建議還是用資料庫整理數據吧。另外還是多用向量處理,少用for循環
推薦閱讀:
※截至 2014 年 7 月初,魅族 MX3 的銷量有多少?
※如何看待2015年中國育齡婦女總和生育率僅為1.047?
※如果一個女生說,她集齊了十二個星座的前男友,我們應該如何估計她前男友的數量?
※鄉鎮衛生院是法人單位還是產業活動單位?
※Excel 做折線圖,有的數值比其他大好幾個數量級,結果顯示時其他的變化都不明顯,請問如何調整?