熱線電話:13121318867

登錄
首頁精彩閱讀R讀寫Excel文件中數據的方法
R讀寫Excel文件中數據的方法
2018-06-26
收藏

R讀寫Excel文件中數據的方法

R語言讀寫Excel的方法有很多,但每種方法都有讓人頭疼的地方,如xlsx包的代碼復雜,只支持Excel2007;RODBC不易理解,限制太多,程序不穩定,會出各種怪毛病。另存為csv格式的方法倒是比較通用比較穩定,但又存在操作麻煩,無法程序化處理多個文件的問題。提取xml也是個辦法,但步驟太多代碼太復雜,令人望而生畏。用剪貼板轉換也不好,這同樣需要人工參與,還不如存為csv。

相比之下,用gdata包來讀取,配合WriteXLS寫入Excel則可以很好的避開上述麻煩。這兩個包都支持Excel2003和Excel2007,運行穩定,代碼簡單直觀,也不需要人工參與。下面用一個例子來說明這兩個函數包讀寫Excel的方法。

目標:

ordersData目錄下有多個結構相同的Excel文件,有些是Excel2007格式,有些是Excel2003格式,這些文件存儲著歷年來的銷售訂單。請讀取這些文件,并統計出每個客戶的總銷售額,最后將結果寫入result.xlsx。下面是2011.xlsx的部分數據:

代碼:

library(gdata)
library(WriteXLS)
setwd("E: /ordersData")
fileList<-dir()
orders<-read.xls(fileList[1])
for (file in fileList[2:length(fileList)]){
  orders<-rbind(orders,read.xls(file))
}
result<-aggregate(orders[,4], orders[c(2)],sum)  
WriteXLS("result","result.xlsx")

result.xlsx中的部分數據如下:

    代碼解讀
1、library(gdata)和library(WriteXLS)這兩句代碼用來引入第三方函數包,這兩個包具有read.xls和WriteXLS函數,可以分別執行讀取和寫入Excel的動作。
2、fileList<-dir()這句代碼列出了目錄內的所有文件,之后的for語句則是循環讀取文件,并將數據拼合到數據框orders中。如果目錄內有其他文件,則應當用通配符來過濾。
3、result<-aggregate(orders[,4], orders[c(2)],sum),這句代碼用來執行分組匯總,其中orders[,4]代表匯總列(即Amount),orders[c(2)]代表分組列(即Client)。
4、read.xls和WriteXLS雖然來自于不同的包,但都支持data.frame數據類型,因此可以很好的配合起來。另外,read.xls函數可以自動識別Excel2003和Excel2007格式,使用起來非常方便。
5整段代碼都很簡潔,初學者可以輕松掌握。

注意事項:
1.版本
gdata和WriteXLS不是R語言自帶的庫函數,而是第三方包,因此需要額外下載安裝。另外,這兩個函數包都會用到Perl環境,因此挑選合適版本的Perl尤為重要。經過嘗試,當R語言的版本是2.15.0時,gdata最匹配的版本是2.13.3,WriteXLS的版本號則是3.5.0,但用最新的Perl環境與之配合時會出問題,需要使用舊一點的5.14.2版本才行,否則會報以下錯誤:
Error in xls2sep(xls, sheet, verbose = verbose, ..., method = method,  : 
 Intermediate file 'C:\Users\Thim\AppData\Local\Temp\RtmpMHvLZS\file224060624738.csv' missing!
2.性能
讀寫小文件沒問題,但讀寫稍大些的文件時會發現gdata和WriteXLS的性能極差(這也許是Perl的原因),比如讀一個8列20萬行的Excel就需要8到10分鐘。如果特別關注性能,可以使用xlsx函數包。當然,這樣一來就無法支持Excel2003了。事實上,xlsx的性能并不比gdata強太多,真正要解決性能問題,還是應當將所有的Excel文件都轉為2007格式,并解壓出里面的xml文件,通過解析xml文件來讀取數據。
替代方案
對于R語言中存在的版本沖突和性能問題,我們也可以使用Python、集算器、Perl等語言來解決。和R語言一樣,它們都可以讀寫Excel文件并進行數據計算。下面簡單介紹集算器和Python的解決方案。
集算器已將訪問EXCEL的功能打入安裝包,無需單獨下載第三方包,支持讀寫Excel2003和Excel2007,對更老的版本以及Excel2010也支持。代碼如下:


集算器的性能也不錯,讀一個8列20萬行的Excel只需20到30秒。
Python的性能相當優異,但和R類似的是也要用第三方包。本來使用pandas包應當能很簡單地完成xls文件的讀寫任務,但在windows下一直沒有安裝成功(畢竟xls文件主要在windows下產生),最后用xlrd和xlwt3這兩個包配合才實現本算法,這兩個包只支持Excel2003,代碼也復雜了許多:
import xlwt3
import xlrd
from itertools import groupby
from operator import itemgetter
import os
dir="E:/ ordersData/"
fileList =os.listdir(dir)
rowList = []
for f in fileList:
    book=xlrd.open_workbook(dir+f)#循環打開只讀的workbook
    sheet=book.sheet_by_index(0)
    nrows = sheet.nrows
    ncols = sheet.ncols
    for i in range(1,nrows):
        row_data = sheet.row_values(i)
        rowList.append(row_data)#所有的記錄都追加到rowList里
rowList=sorted(rowList,key=lambda x:(x[1]))#分組前的排序
result=[]
for key, items in groupby(rowList, itemgetter(1)):#使用groupby函數分組
    value1=0
    for subItem in items:value1+=subItem[3]
    result.append([key,value1])#最后把匯總結果拼成二維數組
wBook=xlwt3.Workbook()#新建可寫的workbook
wSheet=wBook.add_sheet("sheet 1")
wSheet.write(0,0,"Client")
wSheet.write(0,1,"Sum")
for row in range(len(result)):#循環寫入數據
    wSheet.write(row+1,0,result[row][0])
   wSheet.write(row+1,1,result[row][1])
wBook.save(dir+"result.xls")#保存文件

這個方案要比R語言難用多了。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢