2016年4月8日

课程结构

数据导入

  • 小规模文本文件数据导入:read.table,read.csv
  • 大规模数据导入:readr包,data.table包
  • 数据库数据导入:RODBC包,RMySQL包
  • 其他统计软件数据导入:foreign包
  • 网络数据读取:XML包

数据导出

  • 数据导出为文本文件数据
  • 数据导出到MySQL数据库

本地文档的读写

控制台的输出

用户可以使用print或只输入对象名,即在屏幕上得到显示。如果需要对输出有格式上的要求,则利用format函数进行调整。

set.seed(1)
out <- data.frame(x1=runif(3)*10,x2=c('a','b','c'))
## print(out)
out <- format(out,digits=3)
out
##     x1 x2
## 1 2.66  a
## 2 3.72  b
## 3 5.73  c

控制台的输出

cat(paste(out$x2,out$x1,sep='='),sep='\n')
## a=2.66
## b=3.72
## c=5.73

控制台的输入

用户也可以通过控制台进行交互输入。readline函数可以输入单个字符串数据,而scan函数则可以输入多个数值数据。

x <- readline()
x <- scan()

本地文本输出

output <- file('output.txt')
cat(1:100,sep='\t',file=output)
close(output)

使用file函数建立一个文件连接。前面使用过的cat函数可以直接将数据对象输出到文件连接中,如果文件中已经有内容,可以在cat函数中设置append参数为真,即表示是新增在文件尾部。

本地文本输入

output <- file('output.txt')
input <- scan(file=output)
close(output)

要注意的是scan读入的内容应该是一致的类型,不可能同时读入字符和数值。

字符串的输入输出

如果只需要处理字符串的输入输出,可以考虑使用readLines和writeLines这一对函数。

output <- file('output.txt')
writeLines(as.character(1:12),con=output)
input <- readLines(output)

数据表的读写

read.table和write.table

write.table(iris, file='iris.csv',sep=',')
data <- read.table(file='iris.csv',sep=',')
data <- read.table(file=file.choose() ,sep=',')
data <- read.table('clipboard')

另一种更方便的导入方法是利用Rstudio的功能,在Environment面板选择“import dataset”也是一样的。

小规模文本文件数据导入

read.table()函数可以读取txt、csv等格式的文件,并且可以直接从URL上读取数据。主要参数如下

read.table(file,header = FALSE,
           sep = "",
           nrows = -1,
           skip = 0,
           fill = !blank.lines.skip)
参数 含义 参数 含义
file 文件路径 header 是否将第一行读取为列名
sep 文件的分隔符 nrows 读取的行数
skip 跳过开始的skip行开始读取 fill 将缺失数据定为NA



在实际工作中,我们经常会遇到将excel数据导入到R中,这时我们可以将excel数据另存为csv格式,再用read.csv()函数读入到R

read.csv(file,
         header = TRUE,
         sep = ",",
         fill = "TRUE")

以上列出了read.csv()函数的主要参数,各个参数的含义跟read.table()函数相同

数据导出

数据导出为文本文件数据

write.table函数可以将R中的数据导出到文件文件。主要参数如下

write.table(x,
            file,
            append = FALSE,
            sep = "")
参数 含义 参数 含义
x 数据集 append 是否追加,默认为FALSE
sep 文件的分隔符,默认为空 file 文件路径

大规模数据导入

readr包是Hadley Wickham 和 RStudio团队共同开发的R包,它可以快速的读入大规模的数据。下面对 readr包中read_table函数和R内置read.table函数的读取时间进行对比。关于readr包更深一点的介绍可以参考我们网站的一篇文章将数据快速读入R—readr和readxl包

install.packages("readr")
library(readr)

system.time(read_table(file)) #读取数据文件file

system.time(read.table(file)) #读取数据文件file



data.table包中的fread函数可以快速的读取大规模的数据。除此之外,该包还可以对大规模数据进行快速的取子集,分组计算,数据聚合等操作。

system.time(fread(file)) #读取数据文件file

system.time(read.table(file)) #读取数据文件file

数据库读写

数据库的读写

  • R 语言和关系型数据库的两种配合方式。
    • 用SQL来提取需要的数据,存为文本再由R来读入。
    • 将R与外部数据库连接,直接在R中操作数据库。
  • 连接方式的两种选择:
    • ODBC方式,需要安装RODBC包并安装ODBC驱动
    • DBI方式,可以根据已经安装的数据库类型来安装相应的驱动

RMySQL包的用法

install.packages("RMySQL")
library(RMySQL)

channel <- dbConnect(MySQL(), dbname, username, password) #建立本地连接
dbListTables(channel) #查看数据库的表
dbReadTable(channel, name) #获取整个name表数据
dbDisconnect(channel) #关闭连接

RODBC包的用法

MySQL ODBC接口具体配置流程如下:

  1. windows:控制面板->管理工具->数据源(ODBC)->双击->添加->选中mysql ODBC driver一项填写:data source name 一项填入你要使用的名字, 自己随便命名例如:mysql_data
  2. description一项随意填写,例如mydata。TCP/IP Server 填写服务器IP,本地数据库一般为:127.0.0.1。 user 填写你的mysql用户名,password 填写你的mysql密码。 然后数据库里会出现你的mysql里的所有数据库,选择一个数据库。确定。
install.packages("RODBC")
library(RODBC)

channel <- odbcConnect(dsn, uid, pwd) #建立本地连接
sqlTables(channel)  #查看你在上面所选数据库中的所有表
data <- sqlFetch(channel, sqtable)  #将使用的数据库中的表sqtable连接到R,这样就实现了在R中操作数据库中的数据
sqlSave(channel, dat) #将R中的数据集dat存储到MySQL
sq <- sqlQuery(channel, query)  #在R中通过sql语句query来提取数据
odbcClose(channel) #关闭连接

数据导出到MySQL数据库

dbWriteTable函数可以将R中的数据导出到MySQL数据库。主要参数如下

library(RMySQL)
channel <- dbConnect(MySQL(), dbname, username, password) #建立本地连接
dbWriteTable(channel, name, value)
参数 含义
channel 数据库接口
name 写入到数据库中数据表的名称
value R中的数据集

其它数据导入

其他统计软件的数据

foreign包提供了SPSS,SAS等统计软件的数据导入。

  • read.spss函数可以导入SPSS数据
  • read.ssd函数可以导入SAS数据

一般情况下,我们推荐将SPSS或SAS中的数据另存为csv格式数据,再用前面提到的read.csv函数导入数据。

网络数据读取

如果网页格式比较友好,我们可以使用XML包中的readHTMLTable()函数来抓取网页上的表格数据。以艺恩电影营销智库网站的2015年度中国内地电影总票房数据为例 。

install.packages("XML")
library(XML)

url <- "http://www.cbooo.cn/year?year=2015"
url <- htmlParse(url, encoding="UTF-8") #解析文件,需指定encoding为"UTF-8",否则乱码
tables <- readHTMLTable(url)
table <- tables[[1]] #网页中只有一张表,第一张即是
names(table) <- c("title", "type", "boxoffice", "meanprice",
                  "numofpeople", "nation", "date") #列变量重命名
head(table)

其它数据资源

政府公开数据(Open Data)

  • Data.gov:这是美国政府收集的数据资源。声称有多达40万个数据集,包括了原始数据和地理空间格式数据。使用这些数据集需要注意的是:你要进行必要的清理工作,因为许多数据是字符型的或是有缺失值。
  • Socrata:它是探索政府相数据的另一个好地方。Socrata的一个了不起的地方是,他们有不错的可视化工具,使研究数据更为容易。
  • 一些城市都有自己的数据门户网站设置,可供访问者浏览城市的相关数据。例如,在旧金山数据网站,你可以获得很多数据,从犯罪统计到城市的停车位。
  • 联合国数据网站,例如世界卫生组织提供了丰富的数据资源,从死亡率到世界饥饿统计数字。
  • 美国人口普查局也有相当多的生活数据,例如收入、种族、教育、人口和商业信息。
  • 美国地理调查局数据

经济金融数据

集成数据

这些网站已经从各种地方收集了相当多的数据。有时更容易从这里找到好东西

  • Programmable Web:这是一个探索各类API的好地方。
  • infofochimps:提供了一个数据集市,其中有大量的公开数据资源和API资源。类别非常广泛,从Twitter到地理位置数据。用户甚至可以上传自己的数据。
  • Data Market:这也是一个好地方,数据包括了经济,医疗保健,食品和农业,汽车行业相关的数据。
  • Google Public data explorer:谷歌公共数据浏览容纳大量的数据,从世界发展指标、经合组织和人类发展指标,主要是有关经济数据。
  • Junar:这也是一个很好的提供的数据抓取和传送服务的网站。
  • Buzzdata:这是一个提供数据共享服务的网站,它允许用户上传自己的数据和连接。

新闻资料

  • The New York Times:它有一个很好的API和资源管理器访问任何出版物中的文章。
  • The Guardian Data Blog:卫报的数据博客会定期提供一些数据可视化的文章,其数据可通过Google文档格式下载。