数据读写 Data Reading and Writing 方匡南 厦门大学教授 博士生导师.

Slides:



Advertisements
Similar presentations
第六 章数据库访问页 6.1 数据访问页视图 6.2 创建数据访问页 6.3 编辑数据访问页 6.4 查看数据访问页 退出.
Advertisements

LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
第三章 数据类型和数据操作 对海量数据进行有效的处理、存储和管理 3.1 数据类型 数据源 数据量 数据结构
永安广播电视大学 学生计算机技能培训 2005年3月26日.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
J2EE与中间件技术 ——Lab.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
Hadoop I/O By ShiChaojie.
第二讲 搭建Java Web开发环境 主讲人:孙娜
广州健坤网络科技发展有限公司 佛山市正典生物技术有限公司 联合推广的永久免费的GSP软件
大学计算机基础 典型案例之一 构建FPT服务器.
SQL Injection.
辅导课程六.
网络常用常用命令 课件制作人:谢希仁.
PostgreSQL 8.3 安装要点 四川大学计算机学院 段 磊
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Windows网络操作系统管理 ——Windows Server 2008 R2.
第一讲: 基本流程(1).
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
以ISI平台为例,为您演示一下如何在Endnote文献中查看该文献的References
第17章 网站发布.
数据挖掘工具性能比较.
供应商登录CJLR SRM系统入口 CJLR供应商仅可以在互联网上访问SRM系统,无法在CJLR内网登录SRM系统.
VSS使用简介 王树升
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
Java语言程序设计 清华大学出版社 第8章 输入输出流(1).
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第二章 登录UNIX操作系统.
新PQDT论文全文库提交平台.
学习目标 1、什么是字符集 2、字符集四个级别 3、如何选择字符集.
Web安全基础教程
数据透视表与SQL典型应用 ——数据分析人士必杀技
VB与Access数据库的连接.
姚金宇 MIT SCHEME 使用说明 姚金宇
计算机网络与网页制作 Chapter 07:Dreamweaver CS5入门
项目二:HTML语言基础.
教育部 财政部 网络教育数字化学习资源中心平台系统 安装与配置
Web安全基础教程
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
数据库系统与应用实验 基于SQL Server 2005.
第六章 Excel的应用 一、Excel的单元格与区域 1、单元格:H8, D7, IV26等 2、区域:H2..D8, HS98:IT77
第4章 Excel电子表格制作软件 4.4 函数(一).
iSIGHT 基本培训 使用 Excel的栅栏问题
文档创建与发布操作要点 青海省教育信息中心 2018年12月18日.
3.16 枚举算法及其程序实现 ——数组的作用.
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
Logo 思维 力量 商务展示·企业内训.
Visual Basic程序设计 第13章 访问数据库
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Python 环境搭建 基于Anaconda和VSCode.
回归分析实验课程 (实验三) 多项式回归和定性变量的处理.
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
VB与Access数据库的连接.
数据表示 第 2 讲.
WEB程序设计技术 数据库操作.
第四章 UNIX文件系统.
使用ADO访问数据库 李宝智 BonizLee 课程 10564A
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
第六讲 酒店客房管理系统(二) 教育部“十二五”职业教育国家规划教材
RefWorks使用指南 归档、管理个人参考文献.
培训课件 AB 变频器的接线、操作及参数的备份 设备动力科.
学习目标 1、什么是列类型 2、列类型之数值类型.
百万行、千万行数据查询教程 老黄牛.
Presentation transcript:

数据读写 Data Reading and Writing 方匡南 厦门大学教授 博士生导师

目录 Contents 一、数据的读入 二、写出数据

数据的读入Reading in the Data 1 数据的读入Reading in the Data

R的数据读入灵活方便,可以在R软件中直接输入,也可以读入外部文件。对于大数据量来说,一般需要从外部读入数据,外部的数据源很多,可以是网络、电子表格、数据库、文本文件、论文等形式,所以录入数据的方法也就很多。关于R的导入导出,可以阅读“R Data Import/Export”。我们介绍一些R读入各种数据的不同方法,各种方法都有自己的优势,至于哪种方法最好是要根据实际的数据情况来决定的。

直接输入数据 c()函数是把各个值连成一个向量或列表,可以形成数值型向量、字 符型向量或其它类型向量,它的使用非常简单,例如: > x <- c ( 1 , 2 , 3 , 4 ) # 读入数值向量 > x [1] 1 2 3 4 > y <- c ( "a" , "b" , "c" ) # 读入字符向量,注意每个分量用“” > y [1] "a" "b" "c"

直接输入数据 scan()函数的功能类似于c函数,也是由键盘输入数据。当你输入 scan(),然后按回车键,这时将等待你输入数据,数据之间只要空 格分开即可(c函数要用逗号分开)。输入完数据,再按回车键,这 时数据录入完毕。例如: > x <- scan ( ) 1: 1 2 3 4 5 6 7: Read 6 items

读R包中的数据 在R中,如果需要从其他的软件包链接数据,可以使用data ( package = " " ),例如要查看ISLR包里有哪些自带的数据,可以用以下代码来 查看: > data ( package = "ISLR" ) 如果需要读入ISLR包里Wage数据,可以输入以下代码: > data ( Wage , package = "ISLR" )

从外部文件读入数据 大的数据对象常常是从外部文件读入。R语言可以读入的外部数 据源有很多,包括网络、电子表格、数据库、文本文件、论文 等形式,所以录入数据的方法也就很多。一般来讲,建议用 excel等先处理一下数据,然后再用R读入。

读入文本文件 读入文本文件数据的命令是:read.table ( file , header = logical_value , sep = "delimiter" , row.names = "name" ) 其中,file是一个带分隔符的ASCII文本文件,header表明首行是否包 含了变量名,sep用来指定分隔符。

读入文本文件 R语言对外部文件常常有特定的格式要求:第一行可以有该数据框的变量名,随 后的行中第一个条目是行标签,其它条目是各变量的取值。在文件中,第一行 应比第二行少一个条目,这样做是被强制要求的。例如将图1中的学生数据存在 student.txt文本文件中,默认情况下,数值项(除了行标签)以数值变量的形 式读入,对应非数值变量则以因子形式读入,如sex变量。 > s1 <- read.table ( "student.txt" ) > s1 V1 V2 V3 1 class sex score 2 1 女 80 3 1 男 85 … 图1 student.txt文本文件

读入文本文件 但是在很多情况下,我们都需要忽略掉行标签而直接使用默认的行 标签。这时,可以用如下命令读入: > s2 <- read.table ( "student.txt" , header = T ) > s2 class sex score 1 1 女 80 2 1 男 85 3 2 男 92 … 其中,header = T选项用来指定第一行是标题行,并且因此省略文 件中给定的行标签。

读入文本文件 另外需要说明的是,此处默认student.txt文件保存在当前工作目录 下,如果文件不是保存在当前工作目录的话。有两种方法处理:第 一,在R或者Rstudio种更改student.txt文件所在的文件夹为当前工 作目录;第二,输入路径名,比如student.txt文件保存在 E:\R\data目录下,则可以输入命令read.table ( "E:\\R\\data\\student.txt" , header = T )。注意,在R中输入 路径名,需要把“\”改为“\\”或者“/”。

读入Excel格式数据 对于一般常用的.xls和 .xlsx数据表,由于该格 式比较复杂,应尽量避 免直接导入。我们通常 的处理方法是将.xls转 换为.csv文件,转换方 法可以在Excel里单击另 存为csv格式,如图2所 示。 图2 .xls转为.csv格式

读入Excel格式数据 接下来就可以直接将.csv格式的数据读入到R中了,这可以通过 read.csv()函数来实现:read.csv ( file = "file.name" , header = TRUE , sep = "," , ... ) 其中,header表示是否含有列名,默认是TRUE,这点与read.table 不同,sep表示.csv文件的分隔方式,一般是逗号分隔符。

读入Excel格式数据 例如读入student.csv格式的数据: > S2 <- read.csv ( file = "student.csv" ) > S2 X class sex score 1 1 1 女 80 2 2 1 男 85 3 3 2 男 92 … 如在欧洲,需要读入的数据是用逗号表示数字中的小数点,那就要 用函数read.csv2()。

读入Excel格式数据 当然,R也是可以直接读入.xlsx格式的文件的,不过需要安装xlsx 包,外有名为xlsx的包来导入Excel数据(需要在电脑上安装Java运 行环境)。xlsx包可以读取Excel文件为数据框,并将数据框写入为 Excel文件,而且还能处理Excel中的格式,比如合并单元格,设置 列的宽度,设置字体和颜色等等。读取/写入操作分别使用 read.xlsx()和write.xlsx(),另外还有两个相应的函数 read.xlsx2()和write.xlsx2()也可以实现,这两个函数的效率相对 会更高一些。 此外,read.delim()和read.delim2()可以读入制表符分隔文件,其 他和read.table()功能基本相似。

表1 读入外部数据的常用命令比较 函数 header 表头 sep 默认分隔符 quote 字符值是否在引号中 dec 小数表示 read.table FALSE   \” 或 \’ . read.csv TRUE , \” read.csv2 ; read.delim \t read.delim2 参数header是用来设定读入数据,第一行是否表头;sep用来设定分隔符, 其中\t表示制表符;参数quote表示字符值是否在引号内,比如读入的数据 name是“Zhang”的格式,即字符值是用“”,这个就可以令quote = ” \” ” ;dec表示小数的表示方法。

读入SQL Server数据库数据 R还可以通过RODBC包访问SQL Server数据库,这通常需要经过两 个步骤:

配置 ODBC 数据源 这里我们介绍Windows 下 的 ODBC 配置。首先打开 “控制面板”,进入“管 理工具”菜单,选择“数 据源(ODBC)”会出现如 图3的窗口。 图3 数据源窗口

配置 ODBC 数据源 图3的数据源名称“SQLServer”是 我们已经添加了的,随便取的名字 ,一般第一次是没有这个的。如果 驱动程序列没有 SQL Server,则 需要单击“添加”,这时会出现图 4的界面。这里我们把名称写成 “SQLServer”,即数据源名称( Data Source Name,DSN),服务 器选择 local,或者其他选项。 图4 添加数据源

配置 ODBC 数据源 单击“下一步”按钮,界面如 图5:选择“使用用户输入登 录ID和密码的SQL Server验证 (S)” 输入用户名和密码, 如登录名为sa,密码为ok。 图5 输入用户名和密码

配置 ODBC 数据源 单击“下一步”按钮,更改默认数据库为 TEST,那么 R 语言 conn <- odbcConnect ( 'SQLServer' , uid = 'sa' , pwd = 'ok’) Result <- sqlQuery ( conn , 'select * from student’) 连接的数据库就是 TEST,其中 student 表为 TEST 数据库中的表。 单击“下一步”按钮,完成。

R语言连接数据库 首先载入 RODBC 包,然后使用 odbcDataSources()函数查看可用的 数据源。代码如下: > library ( RODBC ) > odbcDataSources() > conn <- odbcConnect ( 'SQLServer' , uid = 'sa' , pwd = 'ok' ) > result <- sqlQuery ( conn , 'select * from student' ) > result > odbcClose ( conn )

R语言连接数据库 我们发现 SQL Server的数据源名称为“SQLServer”,记住这个名 称,然后建立数据库的连接,使用的命令行如下: > conn <- odbcConnect ( "SQLServer" , uid = "sa" , pwd = "ok" , case = "tolower" ) 其中,第一个参数就是刚才odbcDataSources()函数列出的 SQL server 数据源的名称,uid 为用户名,pwd 为密码,case 参数表 示大小写转换,因为 Windows 默认将字符转换为小写。至此如果不 出任何错误的话,就代表连接建立成功,之后就可以进行对数据库 的查询或者将处理好的数据框以数据表的形式存入数据库操作。本 例中仅给出查询的样例,其他操作请参考 RODBC 的帮助文档。

读入其他格式数据 要读入其他格式的数据,必须先安装和载入“foreign”包。 > install.packages ( "foreign" ) > library ( foreign )

读入其他格式数据 对于SAS数据,R只能读入SAS Transport format(XPORT)文件。 所以,需要把普通的SAS数据文件(.ssd和.sas7bdat)转换为 Transport format(XPORT)文件,再用命令:read.xport()。 > read.xport ( "dataname.xpt" ) # 读入SAS格式文件

读入其他格式数据 使用read.spss()可读入SPSS数据文件。例如: > read.spss ( "dataname.sav" ) # 读入SPSS格式文件 也可以使用Hmisc包中的spss.get()函数。spss.get()是对 read.spss()的一个封装,可以自动设置很多参数,整个转换过 程更加简单一致。 > install.packages ("Hmisc") # 安装Hmisc包 > library ( Hmisc ) # 载入Hmisc包 > mydataframe <- spss.get ( "dataname.sav" , use.value.labels = TRUE )

读入其他格式数据 R可读入epi5和6的数据库。例如: R可读入Stata5、6、7的数据库。命令为: > ttt<- read.epiinfo ( "d:/ttt.rec" ) R可读入Stata5、6、7的数据库。命令为: read.dta ( "文件名.dta" )

读入其他格式数据 对于SAS数据,R只能读入SAS Transport format(XPORT)文件。 所以,需要把普通的SAS数据文件(.ssd和.sas7bdat)转换为 Transport format(XPORT)文件,再用命令:read.xport()。 > read.xport ( "dataname.xpt" ) # 读入SAS格式文件

批量读入数据 做数据挖掘,经常需要自动读入很多文件,这些文件都放在一个 文件夹下,并且文件命名除了文件的序号外都是一样的,比如 DATA2004.csv, DATA2005.csv,……。这些文件如果手动逐个读 入会比较麻烦。特别的,若文件数达到几千上万个的话,手动读 入则是一个非常愚蠢的做法。其实通过编写几行很简单的命令就 可以自动批量地读入这些文件,例如: > for ( id in 2004 : 2100 ) { Id <- paste ( "DATA" , id , sep = "" ) dat <- read.csv ( paste ( Id , ".csv" , sep = "" ) , header = T , sep = "," ) … }

批量读入数据 注意paste()函数可以把字符串和字符串或字符串与数值连接起来。 其用法为: paste ( ... , sep = " " , collapse = NULL ) 其中,参数sep表示分隔符,默认为空格;参数collapse可选,如果 不指定值,那么函数paste的返回值是自变量之间通过sep指定的分 隔符连接后得到的一个字符型向量,如果为其指定了特定的值,那 么自变量连接后的字符型向量会再被连接成一个字符串,之间通过 collapse的值分隔。这里第一个paste()是把“DATA”与2004-2013 等连接起来,第二个paste()是把“DATA2004”等与“.csv”连接起 来。

R读取文件的几个常错的问题 相信很多R用户在读入数据时都碰到过数据读入出错的问题。出错的 原因很多,但是90%以上的原因主要是编码和TAB分隔问题。尤其容 易出现在不同语言环境和操作系统中

编码问题 首先了解一下编码问题。编码问题或者乱码问题主要是由于不同语 言转换所造成的。由于计算机最早诞生于西方,西方的语言主要是 拉丁字符,有一个标准编码ISO-8859系列,仅支持西方拉丁字符, 并不包含中文字符。西方很多软件的开发都是基于该系列,当使用 中文字符的时候往往会出现乱码问题。为了解决不同文字的编码问 题,计算机界在国际上的支持主要通过Unicode系列编码进行的,就 是统一编码的意思。Unicode有很多变种,其中常见的就是UTF-8编 码,UTF-16。UTF-8编码是很多操作系统的默认编码,比如Uninx / Linux / Mac OSX等。中文Windows当然也支持这种编码,但UTF-8并 不是默认的编码。

编码问题 首先了解一下编码问题。编码问题或者乱码问题主要是由于不同语 言转换所造成的。由于计算机最早诞生于西方,西方的语言主要是 拉丁字符,有一个标准编码ISO-8859系列,仅支持西方拉丁字符, 并不包含中文字符。西方很多软件的开发都是基于该系列,当使用 中文字符的时候往往会出现乱码问题。为了解决不同文字的编码问 题,计算机界在国际上的支持主要通过Unicode系列编码进行的,就 是统一编码的意思。Unicode有很多变种,其中常见的就是UTF-8编 码,UTF-16。UTF-8编码是很多操作系统的默认编码,比如Uninx / Linux / Mac OSX等。中文Windows当然也支持这种编码,但UTF-8并 不是默认的编码。

编码问题 比如我要读入csv格式的数据,数据如图6: 图6 .csv格式数据

编码问题 但当输入R代码时: > dat_ID <- read.csv ( file = "dataID.csv" , header = T , sep = ";" ) Error in type.convert(data[[i]], as.is = as.is[i], dec = dec, numerals = numerals, : '<ca><c7>'多字节字符串有错 结果出错,显示“多字节字符串有错”,这是典型的编码问题。 解决办法是把.csv格式转换成UTF编码格式(转换方法是单击另 存为,然后选取UTF(txt)格式保存)。现在再运行如下代码, 此时就可以成功读取了。 > dat_ID <- read.table ( file = "dataID2.txt" , header = T , sep = "\t" , fileEncoding = "UTF-8" )

分隔符问题 用R读入数据时,读入的时候没显示出错,数据是读进去了,但是把数据捞出 来看时,却发现问题了,数据没有自动分列,而成一整行的。也就是说数据 没有分开,这就是分隔符的问题。比如: > dat <- read.csv ( file = "DATA2013.csv" , header = T , sep = ";" ) > dim ( dat ) #显示只有1列 [1] 1289 1 > head ( dat ) X.ID.V3.V11.V13.V19.V20.V25.V27.V31.V39.V40.V41.V42.V43.V44.V48.V49.V50.V52.V54.V55.V56.V57.V58.V59.V60.V61.V64.V65.V66.V67.V68.V70.V71.V72.V73.V74.V75.V76.V77.V78.V79.V80.V81.V82.V83.V84.V85.V86.V87.V88.D2013.y11,000002.SZ,33267,9676185190,9700013451,8057090424,87.8458,14.7,22.3,741806,0.9481,20812392740,2.14497e+11,6.4879,1.2955,23.7389,0.8578,88450200420,64698436105,7.3457,1.2143,1.37,6.98,0.175,12.2941,0.7368,21.4872,5.8383,4.2651,13.5118,99.8778,95.7421,0.4015,77.997,4.5448,92.2458,88.0021,1.3439,0.3372,0.1349,4.8607,11.7939,1143.6817,54.5437,0.3365,0.3166,0.3157,1.7055,20.1754,26.5056,26.5056,0.41,-19.3689

分隔符问题 这是因为读取数据时,分隔符设置的有问题,查看文件发现分隔符是sep = ","而不是sep = ";"。更改后就可以成功读入数据了。 > dat <- read.csv ( file = "DATA2013.csv" , header = T , sep = "," ) > dim ( dat ) [1] 1289 53 > head ( dat ) X ID V3 V11 V13 V19 V20 V25 V27 V31 1 1 000002.SZ 33267 9676185190 9700013451 8057090424 87.8458 14.70 22.30 741806 2 2 000004.SZ 33252 83875459 83976684 61960792 99.8795 26.10 40.63 11817 3 3 000005.SZ 33217 913743007 914333607 729502562 99.9354 20.15 29.86 110257 …

2 写出数据 Data Output

在将R工作空间里面的数据输出存储的时候,可以使用write()函 数,基本命令为: write ( x , file = "data" , ncolumns = if ( is.character ( x ) ) 1 else 5 , append = FALSE , sep = " " ) 其中,x是数据,通常是矩阵,也可以是向量;file是文件名(默认 时文件名为“data”);append=TRUE时,在原文件上添加数据, 否则(FALSE,默认值)写一个新文件。其他参数参见帮助文件。

对于列表或数据库数据,可以用write. table()函数或write. csv()函数写 纯文本格式的数据文件或 对于列表或数据库数据,可以用write.table()函数或write.csv()函数写 纯文本格式的数据文件或.csv格式数据文件。这两种函数的使用格式 为: write.table ( x , file = "" , append = FALSE , quote = TRUE , sep = " " , eol = "\n" , na = "NA" , dec = "." , fileEncoding = "" ) write.csv ( ... ) write.csv2 ( ... )

例如,将上文的S2数据写出到当前工作目录,命名为S2.txt的文 件里: > write.table ( S2 , "S2.txt" ) 此时,会在当前工作目录下新创建了一个名为S2.txt的文件。再 例如将上文的S2数据写出到E:\\R\\data目录下,命名为S2.csv 的文件里: > Write.table ( S2 , “E:\\R\\data\\S2.csv” ) 此时会在E:\\R\\data目录下新创建了一个名为S2.csv的文件。

另外,R中保存对象的函数是用save(),比如 > x <- stats::runif ( 20 ) > y <- sample ( c ( TRUE , FALSE ) , 20 , replace = T ) > save ( x , y , file = "xy.RData" ) 就在当前工作目录下多了个文件xy.RData,如果要重新读入这个 文件可以用load()。 > load ( file = "xy.RData" ) 如果要保存当前工作环境中的所有对象,可以用使用 save.image()函数。 > save.image ( file = "temp.RData" )

谢 谢! Thank You 方匡南 xmufkn@xmu.edu.cn 请扫描加微信