查看原文
其他

吉林说R系列第二篇:如何进行数据读写

2016-09-11 王吉林 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 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存