
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
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(RNN)家族中,長短期記憶網(wǎng)絡(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認 ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預測分析中的應用:從數(shù)據(jù)查詢到趨勢預判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經(jīng)濟蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準 ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應對策略? 長短期記憶網(wǎng)絡(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學方法在市場調(diào)研數(shù)據(jù)中的深度應用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準確性的基礎 ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03