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

熱線電話:13121318867

登錄
首頁精彩閱讀R語言︱文件讀入、讀出一些方法羅列(批量xlsx文件、數(shù)據(jù)庫、文本txt、文件夾)
R語言︱文件讀入、讀出一些方法羅列(批量xlsx文件、數(shù)據(jù)庫、文本txt、文件夾)
2017-04-23
收藏

R語言︱文件讀入、讀出一些方法羅列(批量xlsx文件、數(shù)據(jù)庫、文本txt、文件夾)

小規(guī)模的讀取數(shù)據(jù)的方法較為簡單并且多樣,但是,批量讀取目前看到有以下幾種方法:xlsx包、RODBC包、批量轉(zhuǎn)化成csv后讀入。
R語言中還有一些其他較為普遍的讀入,比如代碼包,R文件,工作空間等。
source  #讀取R代碼
dget    #讀取R文件
load    #讀取工作空間
————————————————————————————————
SPSS-STATA格式的讀入包——foreign
讀取其他軟件的格式foreign
install.packages("foreign")
#讀取SPSS stata sas
spss<-read.spss("hsb2.sav",to.data.frame=T)
stata<-read.dta("hsb2.dta")
————————————————————————————————
一、小規(guī)模數(shù)據(jù)——簡單讀入方式
read.table、write.table 、read.csv 、write.csv、readLine(字符型格式常用)。
常見格式:
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    read.table(file, header = FALSE, sep = "", quote = "\"'",  
    dec = ".", skip = 0,  
    strip.white = FALSE, blank.lines.skip = TRUE,  
    comment.char = "#") 
其中:
file表示要讀取的文件,其中有一種神級讀入法(file.choose()):
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    read.table(file.choose()) 
header來確定數(shù)據(jù)文件中第一行是不是標題;
sep指定分隔符,默認是空格;
quote是引號,默認就是雙引號;
dec是小數(shù)點的表示,默認就是一個點;
skip是確定是否跳過某些行;
strip.white確定是否消除空白字符;
blank.lines.skip確定是否跳過空白行;
comment.char指定用于表示注釋的引導符號。
在使用read.table、read.csv讀取字符數(shù)據(jù)時,會發(fā)生很多問題:
1、問題一:Warning message:EOF within quoted string;     需要設置quote,read.csv("/..csv",quote = "");
2、問題二:出現(xiàn)所有的數(shù)據(jù)被加入了雙引號,比如“你好”,“睡覺”;                              
     解決方案:先as.character(x[1:5]),可以發(fā)現(xiàn)比如”\”你好\”“,這樣的格式,就可以用sep = "\""來解決。
其中非結(jié)構(gòu)化數(shù)據(jù),在讀入的時候會出現(xiàn)很多分隔符的問題,
——————————————————————————————————————————————————————————————————
二、數(shù)據(jù)庫讀入——RODBC包
RODBC包中能夠基本應付數(shù)據(jù)庫讀入。一般數(shù)據(jù)數(shù)據(jù)庫讀入過程中主要有:
連接數(shù)據(jù)庫(odbcConnect)、讀入某張表(sqlFetch)、讀某表某指標(sqlQuery)、關(guān)閉連接(close)
還有一些功能:
把R數(shù)據(jù)讀入數(shù)據(jù)庫(sqlSave)、刪除數(shù)據(jù)庫某表(sqlDrop)
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    #安裝RODBC包  
    install.packages("RODBC")   
    library(RODBC)  
    mycon<-odbcConnect("mydsn",uid="user",pwd="rply")  
    #通過一個數(shù)據(jù)源名稱(mydsn)和用戶名(user)以及密碼(rply,如果沒有設置,可以直接忽略)打開了一個ODBC數(shù)據(jù)庫連接 
    data(USArrests)  
    #將R自帶的“USArrests”表寫進數(shù)據(jù)庫里  
    sqlSave(mycon,USArrests,rownames="state",addPK=TRUE)  
    #將數(shù)據(jù)流保存,這時打開SQL Server就可以看到新建的USArrests表了  
    rm(USArrests)  
    #清除USArrests變量 
    sqlFetch(mycon, "USArrests" ,rownames="state")  
    #輸出USArrests表中的內(nèi)容  
    sqlQuery(mycon,"select * from USArrests")  
    #對USArrests表執(zhí)行了SQL語句select,并將結(jié)果輸出 
    sqlDrop(channel,"USArrests")  
    #刪除USArrests表  
    close(mycon)  
    #關(guān)閉連接 
——————————————————————————————————————————————————————————————————
三、批量讀取——xlsx包
首先嘗試用R包解決。即xlsx包。
xlsx包在加載時容易遇到問題?;径际怯捎贘ava環(huán)境未配置好,或者環(huán)境變量引用失敗。因此要首先配置java環(huán)境,加載rJava包。
百度了一下,網(wǎng)上已有很多解決方案。我主要是參考這個帖子,操作步驟為:
1、 安裝最新版本的java。如果你用的R是64位的,請下載64位java。
下載地址: http://www.java.com/en/download/manual.jsp
要安裝在 C:\Program Files\Java 下面,win8的尤其小心不要安裝為C:\Program Files(x86)??赡苁荝在讀取路徑時,對x86這樣的文件夾不大好識別吧,我第一次裝在x86里,讀取是失敗的。
2、在R中加載環(huán)境,即一行代碼,路徑要依據(jù)你的java版本做出更改。
R
Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jre1.8.0_45\\')
之后再加載rjava包或者xlsx包就成功了。
xlsx包加載成功后,用read.xlsx就可以直接讀取xlsx文件,還可以指定讀取的行和段,以及第幾個表,以及可以保存為xlsx文件,這個包還是很強大的。
但是這個方法存在兩個問題:
1、不是所有的公司電腦都能自由的配置java環(huán)境。很多人的權(quán)限是受限的。而且有些公司內(nèi)部應用是在java環(huán)境下配置的。就算你找了IT去安裝java,但是一些內(nèi)部應用可能會因為版本號兼容問題而出錯,得小失大。
2、用xlsx包讀取數(shù)據(jù),在數(shù)據(jù)量比較小的時候速度還是比較快的。但是如果xlsx本身比較大,包含數(shù)據(jù)多,read.xlsx效率會很低,不如data.table包的fread讀取快捷以及省內(nèi)存。但fread函數(shù)不支持xlsx的讀入。。。
(參見這篇帖子,里面對千萬行數(shù)據(jù),fread也只用了10秒左右,比常規(guī)的read.table或者read.csv至少省時一倍)
綜上,由于java環(huán)境的復雜性與兼容度,還有xlsx包本身讀取速度的限制,用xlsx包讀取xlsx包的方法,更適合于:
1、個人電腦,自己想怎么玩都無所謂,或者高大上的Linux, mac環(huán)境
2、數(shù)據(jù)量不會特別大,而且excel文件很干凈,需要細節(jié)的操作
實際操作案例:
批量寫入
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    #1、讀取xlsx中所有的sheet表格  
    #如果像vector一樣定義List??——list()函數(shù)來主動定義,用data.list[[i]]來賦值  
    data.list<-list()  
    for (i in 1:2){  
      data.list[[i]]=read.xlsx("C1.xlsx",i)  
    } 
批量寫出
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    #3、利用List批量讀出操作  
    #難點:如果構(gòu)造輸出表格的名稱——paste來構(gòu)造名稱  
    flie=list()  
    xlsxflie=paste(1:2,".xlsx",sep="") 
    for(i in 1:2){  
    flie[[i]]=paste("C:/Users/long/Desktop/",xlsxflie[i],sep="")  
    write.xlsx(data.list2[[i]],file)  
    } 
其中出現(xiàn)了一個小錯誤:Error in file[[i]] : object of type 'closure' is not subsettable
這一錯誤是因為我寫錯函數(shù)名字了... file->flie(詳情見:http://bbs.pinggu.org/thread-3142627-1-1.html)
主要運用了list函數(shù),詳情可見:R語言︱list用法、批量讀取、寫出數(shù)據(jù)時的用法
——————————————————————————————————————————————————————————————————
四、批量讀入XLSX文件——先轉(zhuǎn)換為CSV后讀入
CSV讀入的速度較快,筆者這邊整理的是一種EXCEL VBA把xlsx先轉(zhuǎn)換為csv,然后利用read.csv導入的辦法。
WPS中調(diào)用VBA需要額外下砸一個插件,
之后應用list.files以List方式讀入。
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    #lapply讀取法  
    filenames <- list.files("C:/Users/a.csv", pattern = ".csv",full.names = TRUE)  #變成list格式  
    #沒有full.names = TRUE,都會出現(xiàn)cannot open file: No such file or directory  
      
    name=function(x) {  
      read.csv(x,header=T)  
      }  
    datalist <- lapply(filenames,name)  #filenames執(zhí)行name函數(shù)  
———————————————————————————————————————————————————————————————
五、批量讀入文件夾中的指定文件(如*.xlsx)
代碼思路:先遍歷文件夾(list.files),然后通過循環(huán)依次讀寫(read.xlsx)。
為什么lsit.files不能直接把完整數(shù)據(jù)讀入文件?——需要read.xlsx這一步驟
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    ##批量讀入文件夾中的xlsx文件  
    #如何批量讀取一個文件夾中的各種txt文件  
    micepath <- "C:/Users/long/Desktop"  
    micefiles <- list.files(micepath, pattern = "*.xlsx$", full.names = TRUE)  
      
    ##文件信息放入list中  
    files=list()  
    for (i in 1:2){  
      files[i]=read.xlsx(micefiles[[i]],header = F,1)  
    } 
——————————————————————————————————————————————————————————————————
五、批量讀入文件夾中的文本文件(*.txt),并生成名稱、文檔數(shù)據(jù)框
——用在情感分析中情感詞的打分數(shù)
代碼思路:先遍歷文件夾中所有txt(list.files)、構(gòu)造文本讀入函數(shù)(read.txt)、找文本名字(list.files)、然后生成數(shù)據(jù)框(as.data.frame)
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片

    ##批量讀入txt文件,并將文本放入同一個數(shù)據(jù)框  
    reviewpath <- "F:/R語言/R語言文本挖掘/情感分析/數(shù)據(jù)/rawdata/review_sentiment/train2"  
    completepath <- list.files(reviewpath, pattern = "*.txt$", full.names = TRUE)  
      
    ######批量讀入文本  
    read.txt <- function(x) {  
      des <- readLines(x)                   #每行讀取  
      return(paste(des, collapse = ""))     #沒有return則返回最后一個函數(shù)對象  
    }  
    review <- lapply(completepath, read.txt)  
    #如果程序警告,這里可能是部分文件最后一行沒有換行導致,不用擔心。  
      
    ######list轉(zhuǎn)數(shù)據(jù)框  
    docname <- list.files(reviewpath, pattern = "*.txt$")  
    reviewdf <- as.data.frame(cbind(docname, unlist(review)),   
                              stringsAsFactors = F)  
其中,list.files()中,full.names=T代表讀入文件+信息,full.names=F代表讀入文件名字。
本代碼來源于書《數(shù)據(jù)挖掘之道》情感分析章節(jié)。
——————————————————————————————————————————————————————————————————
六、excel的xlsx格式讀取——openxlsx包
跟xlsx包可以一拼,為什么沒有特別好的excel包,因為微軟的軟件不開源,而且內(nèi)嵌設置時長變化,所以么有一款統(tǒng)一的好函數(shù)包,來進行讀取。
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片

    library(openxlsx)  
    data=read.xlsx("hsb2.xlsx",sheet=1) 
——————————————————————————————————————————————————————————————————
七、write.table讀出txt文本
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    write.table(data,"names",  
                quote = F,row.names = FALSE, col.names = FALSE) 
輸出的結(jié)果可能是像excel列表一樣:
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    id   names  
    1      “您好”  
    2      “格式”  
    3      “讀取” 
所以需要去掉行、列名,同時去掉雙引號。
如果我想得到,這樣格式的呢:
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    您好 格式 讀取 
需要調(diào)整ecol,默認的ecol="\n",就是回車,所以會造成換行,所以需要換成“\r”,同時中間需要有空格分開,所以最終ecol="\r\ "用【\+空格】來表達空格

———————————————————————————————————————————————————————————————————
八 文件夾讀入
文件夾讀入的方式也挺多的。
第一步:獲取文件夾內(nèi)全文件內(nèi)容
兩種函數(shù):dir()以及l(fā)ist.files()
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    dir('C:\\Users\\long\\Desktop\\',pattern = "txt$")  
    ist.files('C:\\Users\\long\\Desktop\\',pattern = "txt$") 
同時,可以通過pattren來選擇規(guī)定格式的文件內(nèi)容。
第二步:生成系統(tǒng)路徑
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片

    > paste("C:\\Users\\long\\Desktop\\","txt")  
    [1] "C:\\Users\\long\\Desktop\\ txt"  
    > file.path("C:\\Users\\long\\Desktop","txt")  
    [1] "C:\\Users\\long\\Desktop/txt" 
對比兩者,一般用paste來生成系統(tǒng)路徑的時候,在最終結(jié)果,結(jié)合的地方會多一個空格,當然也可以用去空格的方式排除,但是不夠好。
所以可以用file.path的方式直接生成,比較方便,而且絕對正確。
————————————————————————————————
應用一:R語言中大樣本讀出并生成txt文件
    筆者進過分詞處理之后的文本詞量有3億+個詞,一下子導出成txt馬上電腦就死機,報錯內(nèi)存不足的問題。
    于是在找各種辦法解決如何生成一整個TXT文件。于是就有以下比較簡單的辦法,可以直接實現(xiàn)。
    步驟一:先把分詞內(nèi)容拆分成幾個部分,輸出成多個txt文件;
    步驟二:用windows自帶的CMD里面的指令,來生成特定的TXT文件。
    1、使用組合鍵“Win + R”打開運行窗口,輸入“cmd”命令,進入命令行窗口。
    2、在命令行窗口,進入需要合并的Txt文件的目錄,如下圖所示已進行“F:\stock”目錄。


    3、確認目錄正確后,輸入“type *.txt >>f:\111.txt”,該命令將把當前目錄下的所有txt文件的內(nèi)容輸出到f:\111.txt。


    4、到此,打開合并后的f:\111.txt,即可看到多個Txt文件都已按順序合并到F盤的111.txt文件中。
————————————————————————————————————————————
     應用二:R語言中,用write.csv時候,用office打開,多出了很多行?
      如果文本字符長度很大,那么就會出現(xiàn)內(nèi)容串到下面一行的情況,譬如10行的內(nèi)容,可能變成了15行。好像office默認單個單元格的字符一般不超過2500字符,超過就會給到下一行。
      所以筆者在導入5W條數(shù)據(jù)時候,多出了很多行,于是只能手動刪除。
      如果用txt格式導出,用Notepad++打開是好的,但是用excel打開又多出來不少行,所以用excel打開是用代價的。
      但是由于excel是最好的導入SQL的格式,于是不得不手工刪除,同時犧牲一部分的內(nèi)容。
————————————————————————————————————————————
應用三:R語言中,用tcltk讀入時候,報錯?
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    Error: OutOfMemoryError (Java): Java heap space 
因為從錯誤信息來看,是因為你使用的報表占用太多內(nèi)存(不夠或者沒有釋放),而導致堆內(nèi)存溢出。
解決方案從兩個方面著手,1、加大內(nèi)存如-Xmx1024m;2、檢查優(yōu)化代碼及時釋放內(nèi)存
————————————————————————————————————————————
應用四:用R語言來移動圖片文件——file.copy
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    for (i in 1:length(selectname)){  
      originpath = paste(origin_source,selectname[i],sep = '')  
      savepath = paste(save_path,selectname[i],sep = '')  
      file.copy(originpath, save_path)  
    } 
可以看到file.copy是主要用來做移動的函數(shù),originpath是路徑名(細致到文件名稱以及后綴),savepath可以是文件夾名稱。

數(shù)據(jù)分析咨詢請掃描二維碼

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

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

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } 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(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".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 = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+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); }