99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線(xiàn)電話(huà):13121318867

登錄
首頁(yè)精彩閱讀R讀寫(xiě)Excel文件中數(shù)據(jù)的方法
R讀寫(xiě)Excel文件中數(shù)據(jù)的方法
2018-06-26
收藏

R讀寫(xiě)Excel文件中數(shù)據(jù)的方法

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

相比之下,用gdata包來(lái)讀取,配合WriteXLS寫(xiě)入Excel則可以很好的避開(kāi)上述麻煩。這兩個(gè)包都支持Excel2003和Excel2007,運(yùn)行穩(wěn)定,代碼簡(jiǎn)單直觀,也不需要人工參與。下面用一個(gè)例子來(lái)說(shuō)明這兩個(gè)函數(shù)包讀寫(xiě)Excel的方法。

目標(biāo):

ordersData目錄下有多個(gè)結(jié)構(gòu)相同的Excel文件,有些是Excel2007格式,有些是Excel2003格式,這些文件存儲(chǔ)著歷年來(lái)的銷(xiāo)售訂單。請(qǐng)讀取這些文件,并統(tǒng)計(jì)出每個(gè)客戶(hù)的總銷(xiāo)售額,最后將結(jié)果寫(xiě)入result.xlsx。下面是2011.xlsx的部分?jǐn)?shù)據(jù):

代碼:

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中的部分?jǐn)?shù)據(jù)如下:

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

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


集算器的性能也不錯(cuò),讀一個(gè)8列20萬(wàn)行的Excel只需20到30秒。
Python的性能相當(dāng)優(yōu)異,但和R類(lèi)似的是也要用第三方包。本來(lái)使用pandas包應(yīng)當(dāng)能很簡(jiǎn)單地完成xls文件的讀寫(xiě)任務(wù),但在windows下一直沒(méi)有安裝成功(畢竟xls文件主要在windows下產(chǎn)生),最后用xlrd和xlwt3這兩個(gè)包配合才實(shí)現(xiàn)本算法,這兩個(gè)包只支持Excel2003,代碼也復(fù)雜了許多:
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)#循環(huán)打開(kāi)只讀的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函數(shù)分組
    value1=0
    for subItem in items:value1+=subItem[3]
    result.append([key,value1])#最后把匯總結(jié)果拼成二維數(shù)組
wBook=xlwt3.Workbook()#新建可寫(xiě)的workbook
wSheet=wBook.add_sheet("sheet 1")
wSheet.write(0,0,"Client")
wSheet.write(0,1,"Sum")
for row in range(len(result)):#循環(huán)寫(xiě)入數(shù)據(jù)
    wSheet.write(row+1,0,result[row][0])
   wSheet.write(row+1,1,result[row][1])
wBook.save(dir+"result.xls")#保存文件

這個(gè)方案要比R語(yǔ)言難用多了。

數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線(xiàn)
立即咨詢(xún)
客服在線(xiàn)
立即咨詢(xún)
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶(hù)后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }