r语言读取excel数据_R语言操纵Excel进行数据透视与批处理
作者:黃天元,復旦大學博士在讀,熱愛數據科學與開源工具(R),致力于利用數據科學迅速積累行業經驗優勢和科學知識發現,涉獵內容包括但不限于信息計量、機器學習、數據可視化、應用統計建模、知識圖譜等,著有《R語言數據高效處理指南》(《R語言數據高效處理指南》(黃天元)【摘要 書評 試讀】- 京東圖書,《R語言數據高效處理指南》(黃天元)【簡介_書評_在線閱讀】 - 當當圖書)。知乎專欄:R語言數據挖掘。郵箱:huang.tian-yuan@qq.com.歡迎合作交流。
最近接到一個任務,需要把保存在Excel表格多工作表的數據讀取出來,然后再進行各種清洗、處理和計算(如長寬轉換、根據公式進行計算、統一雜亂無章的存儲格式等)。一個工作簿中有80多個工作表,每個工作表有自己的名稱,第一行有題目,第二行有中文標注,第三行有英文縮寫碼...如果直接用交互式操作肯定是崩潰的,估計一個月都不一定能做完。數據量不能說大,每張工作表也就8000+行,沒有一個表格是破萬的(事實上綜合所有表格數據最后統計總共有76000+條數據)。
為了完成這個任務,就不得不先讀取所有Excel中的信息,包括工作表名稱、題目、每個表格的所有列都是什么(不知道就沒法計算)。讀取Excel的話,這次用了realxl包,還是比較好用的。可以參考以下鏈接:
CRAN - Package readxl?cran.r-project.org之所以用了它,是因為我手里的Excel表格不僅有xlsx格式的,還有xls格式的。如果工作表不多,可以轉換一下,統一用openxlsx包,但是讀取的時候使用一下還是很便捷的。
能夠讀取之后,后面所有的設計當然還是使用tidyverse生態系統來完成,幾乎沒有無法完成的任務,但中間還是遇到了很多難題,不斷卡殼。比如時間的轉化,發現時間的格式不統一,有的要使用lubridate包來做,有的時候則需要用janitor包來做,最后還要吧兩者的結果合并起來,如下圖所示:
還有在時間上原始表格使用0時作為標準,但是規范化的結果表則需要使用24小時坐標標準,于是我只好把0換成24,但是日期要減少1天:
因為數據特別雜亂,根本無法設置通用函數來處理一切,為批處理帶來了巨大的挑戰。其中,使用匯總函數(max/min/mean)需要忽略缺失值,為了少寫一些na.rm = T,我參考了SO的內容,進行了全局設置。此外,還需要認為定義上旬、中旬、下旬(case_when),并對組內的數據再次進行分組匯總:
在summarise函數中使用by函數可以繼續匯總,不過要保證匯總之后你還需要繼續匯總,因為summarise函數最終只能夠返回一個值。同樣,使用方括號的方法也能夠實現定制化的組內匯總。
最后不能不提的是,必須要把處理好的數據再次導入到多工作表的Excel中,這個任務我在以前都還是先導出為csv文件然后再復制粘貼的,但是這次的工作量太大,顯然是不實際的。這時候我花了一點時間認真地學了一下openxlsx這個包,僅僅幾個函數,就讓這個任務變得便捷無比。鏈接如下:
CRAN - Package openxlsx?cran.r-project.org這個包近一個月被下載20萬+次,不是開玩笑。我主要用到了以下三個函數:
- loadWorkbook(讀取)
- writeData(寫入工作表)
- saveWorkbook(保存)
就是這么簡單的幾個函數,威力卻極為巨大。對于xlsx文件來說,openxlsx無疑已經登峰造極了,不依賴Java,使用Rcpp加速。不過因為我要進行多次存取,對Excel文件的存取依然是相對費時的,建議使用二進制來進行讀取,我這里用了readr包的的read/write_rds函數進行工作簿對象的讀寫。內存占用會稍微大一點(對于計算機來說空間沒有時間重要),但是讀寫速度會非常快。
對于需要使用Excel進行批處理的小伙伴,這里強推openxlsx這個包,能夠對多工作表的工作簿進行批量化讀入寫出,過程可以說是具備半自動化智能,真乃神器!
總結
以上是生活随笔為你收集整理的r语言读取excel数据_R语言操纵Excel进行数据透视与批处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在保留个人文件的前提下重置系统重置电
- 下一篇: 电脑进水了怎么办电脑进水了如何修电脑