吉林说R系列第二篇:如何进行数据读写
1.引言
本周在刷微博的时候看到一篇博文叫做《一个农村女孩的自由》,写的真实感人,其内容折射出了中国农村很长一段时间的现状。人生的选择很多,选择代表了对某种事物的把握,也注定要失去另一些领域的体验,这就是机会成本。无论农村女孩是遵循父母的旨意辍学打工挣钱盖新房,然后结婚生子打麻将抑或是变土豪,还是咬紧牙关考上大学开阔视野挤进城市人群当精英,每一种成功都带有百般的努力和一份运气,在此希望那些在踏入人生漫无边际的孤独与荒凉,处在最困难时期的人们,能够凭借当初的记忆为自己点亮一盏灯。学习R也是,读别人的故事,写自己的故事。好了,接下来说正题。
最近有很多人在问我如何读取数据,怎么将结果写入一个文件中之类的问题,错误的类型各种各样。偶尔在看一些博文的时候也觉得介绍的不是很详细,周末利用闲散的时间就写一下R语言数据读写问题,后来觉得这个命题太大,不过没有关系,尽可能的将自己知道的东西写出来,希望能够对初学R语言的同学有帮助,避免在数据分析的第一步就卡主,郁闷的失去对R和对自己的信心。
2.设置自己的工作目录
R语言在读写文件的时候,路径及当前工作目录是非常重要的,这对初学者也是一大障碍,往往比较郁闷的是,很多同学看到别人的博文贴出了程序和结果都是正常,为什么将文中的代码复制到自己的电脑却不能运行,一气之下,不是抱怨作者埋坑就是怀疑人生。这里给大家介绍一些工作目录的设置情况。想要获得当前目录,使用函数getwd(),例如,
> WD <- getwd()
> WD
[1] "D:/RYUYAN"
想要设置当前目录,使用函数setwd(),函数,例如,我们想将当前工作目录设置为桌面,
> setwd("C:/Users/jilin/Desktop")
> WD <- getwd()
> WD
[1] "C:/Users/jilin/Desktop"
需要注意的是,一方面,“/”和“\”的意义不一样,在设置路径代码中,可以选择“/”隔开父子文件夹,也可以用“\\”隔开父子文件夹,但是直接粘贴Windows系统文件目录:“C:\Users\jilin\Desktop”会报错。另一方面,这样设置的R当前工作目录,当你关闭R窗口,再重新打开,又会变为之前默认的设置,如何能够保证每次R打开后的工作目都是指定一个文件夹呢?可以这样设置,右键单击R桌面快捷方式图标,选择属性,弹出对话框(如下图),在起始位置中填入你需要的设置的工作目录即可。
3.读数据的方法简介
(1)从excel读数据
从excel读取数据,方法很多,在这里介绍几种常用的方法。
首先,从剪切板读入数据,用read.table()函数。例如,我们要从文件sdebankplace.xlsx中将顺德农商银行网点相关数据读入到R中,首先打开该文件,然后选中需要读入的数据,复制,执行以下命令即可。
> sdebankplace=read.table("clipboard",header=T)
> head(sdebankplace,1)#查看第一行数据
网点名称 地址 纬度 经度 电话
1 顺德区农村商业银行(新桂支行) 大良街道东乐路新桂中路 22.84094 113.2783 <NA>
> names(sdebankplace)#查看数据包含的变量
[1] "网点名称" "地址" "纬度" "经度" "电话"
其次,利用RODBC包读取excel文件。RODBC包里含有很多函数,不仅有excel的,还有access的。下面我们安装包读取我们刚刚的sdebankplace.xlsx文件。
> channel1 = bcConnectExcel("sdebankplace.xlsx")#建立链接
> channel1#查看链接信息
RODBC Connection 2
Details:
case=nochange
DBQ=D:\RYUYAN\sdebankplace.xlsx
DefaultDir=D:\RYUYAN
Driver={Microsoft Excel Driver (*.xls)}
DriverId=790
MaxBufferSize=2048
PageTimeout=5
> sqlTables(channel1)
TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE
1 D:\\RYUYAN\\sdebankplace.xlsx <NA>
> sdebankplace =sqlFetch(channel1, "sdebankplace")#获取sdebankplace表的数据
> head(sdebankplace,1)#查看第一行数据
需要注意的是,这里的函数只支持32位的R,如果你的R是64位的,则会出现错误,如,
> channel1 = odbcConnectExcel("sdebankplace.xlsx")
Error in odbcConnectExcel("sdebankplace.xlsx") :
odbcConnectExcel is only usable with 32-bit Windows
close(channel1)#在读完数据后关闭链接
再次,用利用excel.link包读取excel文件。函数xl.read.file(filename, header = TRUE),更多参数设置,可以查看函数帮助了解,下面我读取当前目录下的一个文件iris.xlsx
> install.packages("excel.link")
> library(excel.link)
> iris1=xl.read.file("iris.xlsx",header = T)
> names(iris1)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
> head(iris1,1)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
需要注意的是,这里的函数只支持数据为英文状态,如果的数据含有中文则会出现如下警告,读取的数据中文变成NA。
> sdebankplace=xl.read.file("sdebankplace.xlsx",header = T)
Warning message:
In xl.read.range(xl.rng, drop = FALSE, na = na, row.names = row.names, :
There are duplicated rownames. They will be ignored.
最后,用xlsx包读取excel文件。read.xlsx(file, sheetIndex),更多参数设置,可以查看函数帮助了解,下面我读取当前目录下的一个文件sdebankplace.xlsx。
> install.packages("xlsx")
> library(xlsx)
> sdebankplace=read.xlsx("sdebankplace.xlsx",1,encoding='UTF-8')
> head(sdebankplace,1)
网点名称 地址 纬度 经度 电话
1 顺德区农村商业银行(新桂支行) 大良街道东乐路新桂中路 22.84094 113.2783 NA
> names(sdebankplace)
[1] "网点名称" "地址" "纬度" "经度" "电话
需要注意的是,编码格式需要设置,否则会出现乱码,如下。
> names(sdebankplace)
[1] "缃戠偣鍚嶇О" "鍦板潃" "绾.害" "缁忓害" "鐢
佃瘽"
(2)从txt文档读数据
首先,从剪切板读取数据,同excel。
其次,用read.table函数,该函数有很多参数设置,请查看帮助了解具体情况。
sdebankplace=read.table("sdebankplace.txt",header = T)
最后,用readLines函数,可以逐行读取,
sdebankplace = readLines("sdebankplace.txt")
需要注意的是,readLines读取的结果与read.table的结果不同,需要进行加工才能提取想要的变量,因此,该函数经常用于读取文本文件等做中文分词只用,读取数据框或者矩阵类型的数据,一般不用该函数,如下,
(3)从csv格式文档读数据
首先,从剪切板读取数据,同excel。
其次,用read.csv(),该函数与read.table()函数基本一样。
sdebankplace=read.csv("sdebankplace.csv",header = T)
最后,如果想批量读取当前目录文件夹下的文件,可以采取如下措施,其中的路径换为大家的目录就好了。
> filenames <- list.files("D:/RYUYAN/", pattern = ".csv")
> data=NULL
> for(i in 1:length(filenames)) {
+ data[i] =lapply( filenames[i],
+ function(name) {read.csv(paste("D:/RYUYAN/", name,sep=""),header = T)
+ })
+ }
> head(data[[1]])
Gender Height Weight
1 Male 73.84702 241.8936
2 Male 68.78190 162.3105
3 Male 74.11011 212.7409
4 Male 71.73098 220.0425
5 Male 69.88180 206.3498
6 Male 67.25302 152.2122
(4)从其他格式文档读数据
对于S-Plus,SAS,SPSS,stata的文件格式,R也可以读取,需载入foreign包。
install.packages("foreign")
library(foreign)
data.restore("filename") #读入S-Plus以data.dump输出的文件
read.S("filename") #读入S-Plus 二进制数据文件
read.xport("filename")#读入SAS(Export)的数据文件
read.ssd("...") #读入SAS.ssd文件
read.spss("filename") #读入SPSS以save或export输出的数据文件
read.dta("filename")#读入stata数据文件
需要注意的是,foreign包只能读取STATA12及以下版本的数据,R如何读入STATA12版本以上的数据。可以加载readstata13或haven包。具体函数参数设置可以查看帮助文档。
#read.dta in package foreign
#and memisc for dta files from Stata versions < 13
#and read_dta in package haven for Stata version >= 13.
library(readstata13)
install.packages("haven")
library(haven)
read.dta13("filename")
read_dta("filename")
(5)从数据库读读数据
R 对于基于 SQL 语言的关系型数据库有良好的支持,这些数据库既有商业数据库 Oracle、Microsoft SQL Server、IBM DB2 等,也包含在 GNUGeneral Public License (GPL) 下发布的 MySQL 等开源数据库。RMySQL 包中提供了到 MySQL 数据库的接口;RODBC 包提供了更为广泛数据库接口的解决方案,支持所有标准 ODBC 接口的数据库。通过这种方式,相同的 R 代码可以方便地应用于不同类型的数据库。没有例子,what a pity。
install.packages("RMySQL")
library(RMySQL)
library (RODBC)
ch <- odbcConnect("dsn",uid = "myuser",pwd = "mypassword")
stocks <- sqlQuery(ch ,"select * from quotes")
odbcClose(ch)
4.写数据的方法简介
写文件和读文件基本上相似的反过程,这里就不在一一赘述了。涉及的主要函数如下图所示,可以查询函数帮助,运行示例,了解具体参数设置方法,需要注意的是,设置好路径。
点击“阅读原文”,即可进入云盘下载文章word版及相关数据。 访问密码 ffd4