Download presentation
Presentation is loading. Please wait.
1
数据读写 Data Reading and Writing 方匡南 厦门大学教授 博士生导师
2
目录 Contents 一、数据的读入 二、写出数据
3
数据的读入Reading in the Data
1 数据的读入Reading in the Data
4
R的数据读入灵活方便,可以在R软件中直接输入,也可以读入外部文件。对于大数据量来说,一般需要从外部读入数据,外部的数据源很多,可以是网络、电子表格、数据库、文本文件、论文等形式,所以录入数据的方法也就很多。关于R的导入导出,可以阅读“R Data Import/Export”。我们介绍一些R读入各种数据的不同方法,各种方法都有自己的优势,至于哪种方法最好是要根据实际的数据情况来决定的。
5
直接输入数据 c()函数是把各个值连成一个向量或列表,可以形成数值型向量、字 符型向量或其它类型向量,它的使用非常简单,例如:
> x <- c ( 1 , 2 , 3 , 4 ) # 读入数值向量 > x [1] > y <- c ( "a" , "b" , "c" ) # 读入字符向量,注意每个分量用“” > y [1] "a" "b" "c"
6
直接输入数据 scan()函数的功能类似于c函数,也是由键盘输入数据。当你输入 scan(),然后按回车键,这时将等待你输入数据,数据之间只要空 格分开即可(c函数要用逗号分开)。输入完数据,再按回车键,这 时数据录入完毕。例如: > x <- scan ( ) 1: 7: Read 6 items
7
读R包中的数据 在R中,如果需要从其他的软件包链接数据,可以使用data ( package = " " ),例如要查看ISLR包里有哪些自带的数据,可以用以下代码来 查看: > data ( package = "ISLR" ) 如果需要读入ISLR包里Wage数据,可以输入以下代码: > data ( Wage , package = "ISLR" )
8
从外部文件读入数据 大的数据对象常常是从外部文件读入。R语言可以读入的外部数 据源有很多,包括网络、电子表格、数据库、文本文件、论文 等形式,所以录入数据的方法也就很多。一般来讲,建议用 excel等先处理一下数据,然后再用R读入。
9
读入文本文件 读入文本文件数据的命令是:read.table ( file , header = logical_value , sep = "delimiter" , row.names = "name" ) 其中,file是一个带分隔符的ASCII文本文件,header表明首行是否包 含了变量名,sep用来指定分隔符。
10
读入文本文件 R语言对外部文件常常有特定的格式要求:第一行可以有该数据框的变量名,随 后的行中第一个条目是行标签,其它条目是各变量的取值。在文件中,第一行 应比第二行少一个条目,这样做是被强制要求的。例如将图1中的学生数据存在 student.txt文本文件中,默认情况下,数值项(除了行标签)以数值变量的形 式读入,对应非数值变量则以因子形式读入,如sex变量。 > s1 <- read.table ( "student.txt" ) > s1 V1 V2 V3 1 class sex score 女 80 男 85 … 图1 student.txt文本文件
11
读入文本文件 但是在很多情况下,我们都需要忽略掉行标签而直接使用默认的行 标签。这时,可以用如下命令读入:
> s2 <- read.table ( "student.txt" , header = T ) > s2 class sex score 女 80 男 85 男 92 … 其中,header = T选项用来指定第一行是标题行,并且因此省略文 件中给定的行标签。
12
读入文本文件 另外需要说明的是,此处默认student.txt文件保存在当前工作目录 下,如果文件不是保存在当前工作目录的话。有两种方法处理:第 一,在R或者Rstudio种更改student.txt文件所在的文件夹为当前工 作目录;第二,输入路径名,比如student.txt文件保存在 E:\R\data目录下,则可以输入命令read.table ( "E:\\R\\data\\student.txt" , header = T )。注意,在R中输入 路径名,需要把“\”改为“\\”或者“/”。
13
读入Excel格式数据 对于一般常用的.xls和 .xlsx数据表,由于该格 式比较复杂,应尽量避 免直接导入。我们通常 的处理方法是将.xls转 换为.csv文件,转换方 法可以在Excel里单击另 存为csv格式,如图2所 示。 图2 .xls转为.csv格式
14
读入Excel格式数据 接下来就可以直接将.csv格式的数据读入到R中了,这可以通过 read.csv()函数来实现:read.csv ( file = "file.name" , header = TRUE , sep = "," , ... ) 其中,header表示是否含有列名,默认是TRUE,这点与read.table 不同,sep表示.csv文件的分隔方式,一般是逗号分隔符。
15
读入Excel格式数据 例如读入student.csv格式的数据:
> S2 <- read.csv ( file = "student.csv" ) > S2 X class sex score 女 80 男 85 男 92 … 如在欧洲,需要读入的数据是用逗号表示数字中的小数点,那就要 用函数read.csv2()。
16
读入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()功能基本相似。
17
表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表示小数的表示方法。
18
读入SQL Server数据库数据 R还可以通过RODBC包访问SQL Server数据库,这通常需要经过两 个步骤:
19
配置 ODBC 数据源 这里我们介绍Windows 下 的 ODBC 配置。首先打开 “控制面板”,进入“管 理工具”菜单,选择“数 据源(ODBC)”会出现如 图3的窗口。 图3 数据源窗口
20
配置 ODBC 数据源 图3的数据源名称“SQLServer”是 我们已经添加了的,随便取的名字 ,一般第一次是没有这个的。如果 驱动程序列没有 SQL Server,则 需要单击“添加”,这时会出现图 4的界面。这里我们把名称写成 “SQLServer”,即数据源名称( Data Source Name,DSN),服务 器选择 local,或者其他选项。 图4 添加数据源
21
配置 ODBC 数据源 单击“下一步”按钮,界面如 图5:选择“使用用户输入登 录ID和密码的SQL Server验证 (S)” 输入用户名和密码, 如登录名为sa,密码为ok。 图5 输入用户名和密码
22
配置 ODBC 数据源 单击“下一步”按钮,更改默认数据库为 TEST,那么 R 语言
conn <- odbcConnect ( 'SQLServer' , uid = 'sa' , pwd = 'ok’) Result <- sqlQuery ( conn , 'select * from student’) 连接的数据库就是 TEST,其中 student 表为 TEST 数据库中的表。 单击“下一步”按钮,完成。
23
R语言连接数据库 首先载入 RODBC 包,然后使用 odbcDataSources()函数查看可用的 数据源。代码如下:
> library ( RODBC ) > odbcDataSources() > conn <- odbcConnect ( 'SQLServer' , uid = 'sa' , pwd = 'ok' ) > result <- sqlQuery ( conn , 'select * from student' ) > result > odbcClose ( conn )
24
R语言连接数据库 我们发现 SQL Server的数据源名称为“SQLServer”,记住这个名 称,然后建立数据库的连接,使用的命令行如下: > conn <- odbcConnect ( "SQLServer" , uid = "sa" , pwd = "ok" , case = "tolower" ) 其中,第一个参数就是刚才odbcDataSources()函数列出的 SQL server 数据源的名称,uid 为用户名,pwd 为密码,case 参数表 示大小写转换,因为 Windows 默认将字符转换为小写。至此如果不 出任何错误的话,就代表连接建立成功,之后就可以进行对数据库 的查询或者将处理好的数据框以数据表的形式存入数据库操作。本 例中仅给出查询的样例,其他操作请参考 RODBC 的帮助文档。
25
读入其他格式数据 要读入其他格式的数据,必须先安装和载入“foreign”包。
> install.packages ( "foreign" ) > library ( foreign )
26
读入其他格式数据 对于SAS数据,R只能读入SAS Transport format(XPORT)文件。 所以,需要把普通的SAS数据文件(.ssd和.sas7bdat)转换为 Transport format(XPORT)文件,再用命令:read.xport()。 > read.xport ( "dataname.xpt" ) # 读入SAS格式文件
27
读入其他格式数据 使用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 )
28
读入其他格式数据 R可读入epi5和6的数据库。例如: R可读入Stata5、6、7的数据库。命令为:
> ttt<- read.epiinfo ( "d:/ttt.rec" ) R可读入Stata5、6、7的数据库。命令为: read.dta ( "文件名.dta" )
29
读入其他格式数据 对于SAS数据,R只能读入SAS Transport format(XPORT)文件。 所以,需要把普通的SAS数据文件(.ssd和.sas7bdat)转换为 Transport format(XPORT)文件,再用命令:read.xport()。 > read.xport ( "dataname.xpt" ) # 读入SAS格式文件
30
批量读入数据 做数据挖掘,经常需要自动读入很多文件,这些文件都放在一个 文件夹下,并且文件命名除了文件的序号外都是一样的,比如 DATA2004.csv, DATA2005.csv,……。这些文件如果手动逐个读 入会比较麻烦。特别的,若文件数达到几千上万个的话,手动读 入则是一个非常愚蠢的做法。其实通过编写几行很简单的命令就 可以自动批量地读入这些文件,例如: > for ( id in 2004 : 2100 ) { Id <- paste ( "DATA" , id , sep = "" ) dat <- read.csv ( paste ( Id , ".csv" , sep = "" ) , header = T , sep = "," ) … }
31
批量读入数据 注意paste()函数可以把字符串和字符串或字符串与数值连接起来。 其用法为:
paste ( ... , sep = " " , collapse = NULL ) 其中,参数sep表示分隔符,默认为空格;参数collapse可选,如果 不指定值,那么函数paste的返回值是自变量之间通过sep指定的分 隔符连接后得到的一个字符型向量,如果为其指定了特定的值,那 么自变量连接后的字符型向量会再被连接成一个字符串,之间通过 collapse的值分隔。这里第一个paste()是把“DATA”与 等连接起来,第二个paste()是把“DATA2004”等与“.csv”连接起 来。
32
R读取文件的几个常错的问题 相信很多R用户在读入数据时都碰到过数据读入出错的问题。出错的 原因很多,但是90%以上的原因主要是编码和TAB分隔问题。尤其容 易出现在不同语言环境和操作系统中
33
编码问题 首先了解一下编码问题。编码问题或者乱码问题主要是由于不同语 言转换所造成的。由于计算机最早诞生于西方,西方的语言主要是 拉丁字符,有一个标准编码ISO-8859系列,仅支持西方拉丁字符, 并不包含中文字符。西方很多软件的开发都是基于该系列,当使用 中文字符的时候往往会出现乱码问题。为了解决不同文字的编码问 题,计算机界在国际上的支持主要通过Unicode系列编码进行的,就 是统一编码的意思。Unicode有很多变种,其中常见的就是UTF-8编 码,UTF-16。UTF-8编码是很多操作系统的默认编码,比如Uninx / Linux / Mac OSX等。中文Windows当然也支持这种编码,但UTF-8并 不是默认的编码。
34
编码问题 首先了解一下编码问题。编码问题或者乱码问题主要是由于不同语 言转换所造成的。由于计算机最早诞生于西方,西方的语言主要是 拉丁字符,有一个标准编码ISO-8859系列,仅支持西方拉丁字符, 并不包含中文字符。西方很多软件的开发都是基于该系列,当使用 中文字符的时候往往会出现乱码问题。为了解决不同文字的编码问 题,计算机界在国际上的支持主要通过Unicode系列编码进行的,就 是统一编码的意思。Unicode有很多变种,其中常见的就是UTF-8编 码,UTF-16。UTF-8编码是很多操作系统的默认编码,比如Uninx / Linux / Mac OSX等。中文Windows当然也支持这种编码,但UTF-8并 不是默认的编码。
35
编码问题 比如我要读入csv格式的数据,数据如图6: 图6 .csv格式数据
36
编码问题 但当输入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" )
37
分隔符问题 用R读入数据时,读入的时候没显示出错,数据是读进去了,但是把数据捞出 来看时,却发现问题了,数据没有自动分列,而成一整行的。也就是说数据 没有分开,这就是分隔符的问题。比如: > dat <- read.csv ( file = "DATA2013.csv" , header = T , sep = ";" ) > dim ( dat ) #显示只有1列 [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, SZ,33267, , , , ,14.7,22.3,741806,0.9481, , e+11,6.4879,1.2955, ,0.8578, , ,7.3457,1.2143,1.37,6.98,0.175, ,0.7368, ,5.8383,4.2651, , , ,0.4015,77.997,4.5448, , ,1.3439,0.3372,0.1349,4.8607, , , ,0.3365,0.3166,0.3157,1.7055, , , ,0.41,
38
分隔符问题 这是因为读取数据时,分隔符设置的有问题,查看文件发现分隔符是sep = ","而不是sep = ";"。更改后就可以成功读入数据了。 > dat <- read.csv ( file = "DATA2013.csv" , header = T , sep = "," ) > dim ( dat ) [1] > head ( dat ) X ID V V V V V20 V25 V27 V31 SZ SZ SZ …
39
2 写出数据 Data Output
40
在将R工作空间里面的数据输出存储的时候,可以使用write()函 数,基本命令为:
write ( x , file = "data" , ncolumns = if ( is.character ( x ) ) 1 else 5 , append = FALSE , sep = " " ) 其中,x是数据,通常是矩阵,也可以是向量;file是文件名(默认 时文件名为“data”);append=TRUE时,在原文件上添加数据, 否则(FALSE,默认值)写一个新文件。其他参数参见帮助文件。
41
对于列表或数据库数据,可以用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 ( ... )
42
例如,将上文的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的文件。
43
另外,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" )
44
谢 谢! Thank You 方匡南 请扫描加微信
Similar presentations