数据的输入输出,包括计算机系统中R语言的键盘输入和显示器输出,程序的数据输入和执行结果输出。
2.7.1 R语言的输入和输出
所谓用户、程序员和计算机交互又称为人机交互,请注意人机交互并不代表科学实验。在R语言中称为开始一个会话,与网络中开始的会话section相同。R语言的命令在命令行>中输入,而且与UNIX系统的shell批处理命令程序类似,R语言可将多个命令集合在一起构成一个脚本文件,然而问题是该脚本文件的输出在哪里?R语言命令脚本文件的输出可在显示器,也可定向输出到一个文件中。
1.语言的输入
语言系统的输入可以是命令,R语言解释器的输入则是命令程序。命令集的脚本文件可保存为.R文件,再用source()命令完成批处理。
>source(Rlcommand.R) #执行一个脚本文件
然而source()函数的另一个功能是编译一个R语言程序或者函数。例如,函数funfactor()保存在funfactor.R文件中,则编译并且调用函数funfactor()的方法,
>source(funfactor.R) #编译funfactor.R文件
>saladrink=funfactor(dafr,salary,levels) #调用函数funfactor()
将R语言程序在编辑窗口输入,可用edit()命令。或者用R语言系统菜单创建一个.R文件再保存。
2.R语言的输出
若将R语言系统的输出重定向到文本文件resultgrep中,则使用sink()命令。
>sink(resultgrep)
则R语言命令的输出将在resultgrep文件中看到。可不再让解释器把每一条输出到显示器上。
若重定向图形输出,例如plot()的输出,可保存在图形文件中。根据图形的属性,选择命令执行。最后将图形重定向恢复设置为显示器输出。windows图元文件和.bmp文件分别是,
>win.metafile("ts1.wmf") #将图形重定向到ts1.wmf文件中
>bmp("ts1.bmp") #将图形保存到ts1.bmp文件,.bmp文件分辨率更高
>dev.off() #输出返回到显示器
2.7.2程序的数据输入和输出
R语言作为开源软件,它的优势是共享和方便用户,它的不利是不正式和不能形成行业。但是,R语言的数据源开放了世界无数的窗口,使有用的数据流动在我们的周围。R语言的数据源,不仅仅是程序员诚实地在键盘上输入得到的,R语言能导入.txt文件、execl文件、流行的商业统计软件SAS,SPSS,Stata文件,数据库的信息和网络上的数据。
1.程序读取键盘输入
若只有少量数据,用函数scan()和readline()接收数据。函数scan()从键盘接收输入并且输出向量,将文件名设置为空,并且接收到空行则表示键盘输入结束。scan()的安静模式可用quiet=TRUE设置。scan()只接收数值和单字符的输入,而readline()接收字符串。
>dv1=scan("")
1: 1 2 3 4 5
6:
>dv1
[1] 1 2 3 4 5
>dv2=scan("")
1: a
2: b
3: c
4:
>dv2
[1]
readline()有两种用途。一个是用readline()方式接收输入一行字符串,保存在字符串向量中。一个是readline("提示内容"),根据提示输入答案。例如,在键盘输入"I hope we go to university together ,but now war is dealed with,please wait for victory."并且保存到向量dv3中。
>dv3=readline()
I hope we go to university together ,but now war is dealed with,please wait for victory.
>dv3
##[1] I hope we go to university together ,but now war is dealed with,please wait for victory.
> dv4=readline("There is your in fact.") #根据提示"There is your in fact."输入回答
There is your in fact.Yes. #Yes是回答(实际情况)
> dv4
[1] "Yes."
2.读取windows文件
scan("filename.txt")快速读取.txt文件到一个向量,若是包括字符的文件,则参数what=""。
>dv5=scan(file1.txt,what="")
Read 5 items.
[1] "1" "2" "3" "quiet" "study"
若windows的.txt文件内容是数据框,则用函数read.table()读取。若数据分析员从事分析execl文件的工作,则可用read.xlsx()读取.xlsx文件,read.xls()读取.xls文件。csv格式文件可用read.csv()读取。readLines()可在文本文件中读取多行数据或者整个文件。.txt文件是空格分隔符,.csv文件是“;”分隔符。
函数read.table()的参数file设定了文件路径,header设置表头,sep设定列间隔方式。输出数据是data.frame。stringsAsFactors=FALSE设置所有的字符保存为字符串类型,默认则是因子factor。
读取.xlsx文件,应安装软件包xls,rJava。rJava软件包必须设置java环境。在系统中设置环境变量path和javapath等。read.xlsx()应注意sheet参数的设置。
>file1="D:/travers/dog.xlsx"
>datafr1=read.xlsx(file1,1) #sheet=1
批量读取文件的方法应该先将批量读取文件存放在固定目录下。用dir()函数获取目录中的文件名,然后用paste()合成路径,最后处理文档。对批量文件可用循环或apply族函数处理。例如:
>doc.names =dir("path")
>doc.path =sapply(doc.names,function(names) paste(path,names,sep='/'))
合成文件路径名
>doc =sapply(doc.path,function(doc) readLines(doc))
3.导入统计软件数据
(1) SPSS数据
统计软件的.sav文件用函数read.spss()读取,保存在数据框中。read.spss()所在软件包foreign。或者使用Hmisc软件包的函数spss.get()。函数spss.get()封装read. spss(),设置参数,最后得到数据分析人员期望的结果。
>library(Hmisc)
>daf=spss.get("data2076.sav",use.value.labels=TRUE) #读取.sav文件
use.value.labels=TRUE表示将有标签的变量保存为因子,而且水平相同
(2)导入SAS数据
foreign包中的read.ssd()和Hmisc包中的sas.get()可读取。注意SAS的较新版本(SAS 9.1或更高版本)可能导致函数并不能正常使用。保存为Transport format(XPORT)文件,可用foreign的函数read.xport()读取。
4.在www网站读取数据
(1) read.csv()读取数据集
为保证例题的正确性,选择《R语言编程艺术》P208页上的例题。函数paste()下载美国加州大学欧文分校的Echocardiogram数据集,保存为.csv文件。
>urluci="http://archive.ics.uci.edu/ml/machine-learning-databases/"
>databasefile=paste(urluci,"echocardiogram/echocardiogram.data",sep=" ")
合成文件名
>dataframe1=read.csv(databasefile) #读取网络文件数据集
(2) read.table()读入数据文件
函数用url地址表示文件,格式非常简单。
> addr=http://www.abcd.com/de.txt
> read.table(file=url(addr))
(3)从网页抓取数据
网页数据有不同格式,可用不同函数读取。readLines()读取文本,readHTMLTable()读取所有表格。 Web数据抓取(Webscraping)过程中,用户从互联网上提取嵌入在网页中的信息,并保存为R语言的列表list。一个方法是使用函数readLines()下载网页,再用grep()过滤信息和gsub()函数处理。readLines()按行读取文本文件,一些非结构化的文本文件,例如电子邮件数据或微博数据,也可使用readLines()。web文件可用单引号,用n=行数表示读取的范围。例如,希望读取哈佛大学html主页前十行的数据,方法见下,
> urlnetaddr='http://www.harvard.edu/' #哈佛大学网址
> dlisa1=readLines(urlnetaddr,n=50)
> dlisa1
>names(disa1) #数据标签
另一种途径的方法是RCurl包和XML包来提取结构复杂的网页中的信息。 此外,scan()也有丰富的参数用来读取非结构化文档。若抓取网页上的表格,可使用XML包的readHTMLTable()函数。函数readHTMLTable()可读取XML数据。
>head(dlisa1[[2]]) #dlisa1是列表
读取《计算机学报》PDF文件http://cjc.ict.ac.cn/online/onlinepaper/cjj-2016823101705.pdf不能使用readLines(),请读者自己思考方法。
4.写文件
保存程序的临时数据到tmp.txt文件,或者将结果保存到result1.xlsx文件,可用函数write.table()与write.csv(),并且可写到表格型数据文件。cat()函数也能输出文件。
另外,与MySQL数据库交换数据可使用RMySLQ软件包。