笔者寄语:小规模的读取数据的方法较为简单并且多样,但是,批量读取目前看到有以下几种方法:xlsx包、RODBC包、批量转化成csv后读入。
read.table、write.table 、read.csv 、write.csv。
常见格式:
read.table(file, header = FALSE, sep = "", quote = "\"'", dec = ".", skip = 0, strip.white = FALSE, blank.lines.skip = TRUE, comment.char = "#")其中:
read.table(file.choose())
在使用read.table、read.csv读取字符数据时,会发生很多问题:
1、问题一:Warning message:EOF within quoted string; 需要设置quote,read.csv("/..csv",quote = "");
2、问题二:出现所有的数据被加入了双引号,比如“你好”,“睡觉”;
解决方案:先as.character(x[1:5]),可以发现比如”\”你好\”“,这样的格式,就可以用sep = "\""来解决。
其中非结构化数据,在读入的时候会出现很多分隔符的问题,
可以见博客:【R】数据导入读取read.table函数详解,如何读取不规则的数据(fill=T)
——————————————————————————————————————————————————————————————————
RODBC包中能够基本应付数据库读入。一般数据数据库读入过程中主要有:
连接数据库(odbcConnect)、读入某张表(sqlFetch)、读某表某指标(sqlQuery)、关闭连接(close)
还有一些功能:
把R数据读入数据库(sqlSave)、删除数据库某表(sqlDrop)
#安装RODBC包 install.packages("RODBC") library(RODBC) mycon<-odbcConnect("mydsn",uid="user",pwd="rply") #通过一个数据源名称(mydsn)和用户名(user)以及密码(rply,如果没有设置,可以直接忽略)打开了一个ODBC数据库连接 data(USArrests) #将R自带的“USArrests”表写进数据库里 sqlSave(mycon,USArrests,rownames="state",addPK=TRUE) #将数据流保存,这时打开SQL Server就可以看到新建的USArrests表了 rm(USArrests) #清除USArrests变量 sqlFetch(mycon, "USArrests" ,rownames="state") #输出USArrests表中的内容 sqlQuery(mycon,"select * from USArrests") #对USArrests表执行了SQL语句select,并将结果输出 sqlDrop(channel,"USArrests") #删除USArrests表 close(mycon) #关闭连接
首先尝试用R包解决。即xlsx包。
xlsx包在加载时容易遇到问题。基本都是由于java环境未配置好,或者环境变量引用失败。因此要首先配置java环境,加载rJava包。
百度了一下,网上已有很多解决方案。我主要是参考这个帖子,操作步骤为:
1、 安装最新版本的java。如果你用的R是64位的,请下载64位java。
下载地址: http://www.java.com/en/download/manual.jsp
要安装在 C:\Program Files\Java 下面,win8的尤其小心不要安装为C:\Program Files(x86)。可能是R在读取路径时,对x86这样的文件夹不大好识别吧,我第一次装在x86里,读取是失败的。
2、在R中加载环境,即一行代码,路径要依据你的java版本做出更改。
R
Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jre1.8.0_45\\')
之后再加载rjava包或者xlsx包就成功了。
xlsx包加载成功后,用read.xlsx就可以直接读取xlsx文件,还可以指定读取的行和段,以及第几个表,以及可以保存为xlsx文件,这个包还是很强大的。
但是这个方法存在两个问题:
1、不是所有的公司电脑都能自由的配置java环境。很多人的权限是受限的。而且有些公司内部应用是在java环境下配置的。就算你找了IT去安装java,但是一些内部应用可能会因为版本号兼容问题而出错,得小失大。
2、用xlsx包读取数据,在数据量比较小的时候速度还是比较快的。但是如果xlsx本身比较大,包含数据多,read.xlsx效率会很低,不如data.table包的fread读取快捷以及省内存。但fread函数不支持xlsx的读入。。。
(参见这篇帖子,里面对千万行数据,fread也只用了10秒左右,比常规的read.table或者read.csv至少省时一倍)
综上,由于java环境的复杂性与兼容度,还有xlsx包本身读取速度的限制,用xlsx包读取xlsx包的方法,更适合于:
1、个人电脑,自己想怎么玩都无所谓,或者高大上的linux, mac环境
2、数据量不会特别大,而且excel文件很干净,需要细节的操作
实际操作案例:
批量写入
#1、读取xlsx中所有的sheet表格 #如果像vector一样定义List??——list()函数来主动定义,用data.list[[i]]来赋值 data.list<-list() for (i in 1:2){ data.list[[i]]=read.xlsx("C1.xlsx",i) }批量写出
#3、利用List批量读出操作 #难点:如果构造输出表格的名称——paste来构造名称 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) }
其中出现了一个小错误:Error in file[[i]] : object of type 'closure' is not subsettable
这一错误是因为我写错函数名字了... file->flie(详情见:http://bbs.pinggu.org/thread-3142627-1-1.html)
——————————————————————————————————————————————————————————————————
CSV读入的速度较快,笔者这边整理的是一种EXCEL VBA把xlsx先转换为csv,然后利用read.csv导入的办法。
WPS中调用VBA需要额外下砸一个插件,
之后应用list.files以List方式读入。
#lapply读取法 filenames <- list.files("C:/Users/a.csv", pattern = ".csv",full.names = TRUE) #变成list格式 #没有full.names = TRUE,都会出现cannot open file: No such file or directory name=function(x) { read.csv(x,header=T) } datalist <- lapply(filenames,name) #filenames执行name函数
为什么lsit.files不能直接把完整数据读入文件?——需要read.xlsx这一步骤
##批量读入文件夹中的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(list.files)、构造文本读入函数(read.txt)、找文本名字(list.files)、然后生成数据框(as.data.frame)
##批量读入txt文件,并将文本放入同一个数据框 reviewpath <- "F:/R语言/R语言与文本挖掘/情感分析/数据/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则返回最后一个函数对象 } review <- lapply(completepath, read.txt) #如果程序警告,这里可能是部分文件最后一行没有换行导致,不用担心。 ######list转数据框 docname <- list.files(reviewpath, pattern = "*.txt$") reviewdf <- as.data.frame(cbind(docname, unlist(review)), stringsAsFactors = F)
其中,list.files()中,full.names=T代表读入文件+信息,full.names=F代表读入文件名字。
本代码来源于书《数据挖掘之道》情感分析章节。