R可以从各种数据软件中导入数据,如下图所示,R可从文本文件、Excel和Access、统计软件、数据库管理系统、专业数据库、网站和在线服务中导入数据。
临床研究中常用数据处理软件有Excel、SPSS、SAS和Stata等,今天介绍下R怎么从这4个软件中读取数据以及怎么导出R中的数据。
目 录
- 1. 读取Excel数据
- 1.1 read.table()函数
- 1.2 read.csv()和read.csv2()函数
- 1.3 3个函数的差别
- 2. 读取SPSS数据
- 2.1 read.spss()函数
- 2.2 spss.get()函数
- 3. 读取Stata数据
- 4. 读取SAS数据
- 5. 导出R中的数据
1. 读取Excel数据
R虽然可以导入SPSS、SAS和Stata软件的数据,但是最好的数据导入方法还是导入经过初步处理的原始数据,而不是导入可能经过另一种统计软件处理过的数据。
读取Excel数据的最好方式就是将Excel转化为csv,然后将csv数据导入到R中。
今天介绍怎么导入csv格式文件。
Excel数据一般为.xlsx
和.xls
格式,可以通过文件-另存为-保存类型-选择保存为csv文件
,然后将csv文件复制到R工作目录中去。
1.1 read.table()函数
可以使用read.table()
函数将带分隔符的文本文件中导入R中。
read.table(file, header = FALSE,sep = "", quote = "\"'",
dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),
row.names, col.names, as.is = !stringsAsFactors,
na.strings = "NA",colClasses = NA, nrows = -1,
skip = 0, check.names = TRUE, fill = !blank.lines.skip,
strip.white = FALSE, blank.lines.skip = TRUE,
comment.char = "#",allowEscapes = FALSE, flush = FALSE,
stringsAsFactors = default.stringsAsFactors(),
fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)
## 部分参数释义
file # 要读取的数据文件名(将文件名包含在""内)。
# 如果数据文件不在R工作目录里,需要使用全路径,所以建议放在工作目录中。
header # 逻辑值;数据文件的第一行是否为变量名;
sep # 分开数据的分隔符;默认为空白""。
# 使用sep=","则读取用逗号分隔行内数据的文件;
# 使用sep="\t"则读取用制表符分割行内数据的文件。
quote # 指定用于包围字符型数据的字符,默认双引号("")或单引号('')
dec # 用来表示小数点的符号。
row.names # 指定行名的向量,或文件中一个变量的序号或名字,默认行号取为1, 2, 3...,
col.names # 如果数据文件的第一行不包括变量名(header=FASLE),
# 则可以用col.names去指定一个包含变量名的字符向量。
# 如果header=FALSE以及col.names选项被省略了,则变量分别命名为V1、V2、V3...
as.is # 逻辑词;为FALSE,则将字符型变量转为因子型变量,
# 为TRUE,则仍将其保留为字符型(TRUE)。
# 也可以是逻辑型、数字型、或字符向量用来指定哪些列不需要转化为因子。
na.strings # 表示缺失值的字符向量。
# 如na.strings=c("-9","?"),表示在读取数据时,会把-9和?值转换成NA。
colClasses # 指定各列变量数据类型的一个字符型向量。
# 如colClasses=c("numeric","numeric","character","NULL","numeric"),
# 前两列读取为数值型,第三列读取为字符型,跳过第四列,第五列读取为数值型。
# 如果数据有多余五列,colClasses的值会被循环。
# 在读取大型文本文件时,指定colClasses参数可以提升处理速度。
nrows # 可以读取的最大行数(忽略负值)。
skip # 在读取数据前跳过的行数。
check.names # 如果为TRUE,则检查变量名是否在R中有效。
fill # 某些情况下,文件中各行的长度不相等,这个参数是个逻辑词,
# 设置read.table在某些值缺失的情况下,是否自动添加空白值。
strip.white # 在sep指定情况下,为TRUE,则删除字符型变量前后多余空格。
stringsAsFactors # 逻辑词,标记处字符向量是否需要转化成因子。
# 默认值是TRUE,除非它被colClases所覆盖。
# 在处理大型文本文件时,设置成stringsAsFactors=FALSE可以提升处理速度。
text # 一个指定文字进行处理的字符串。如果text被设置了,file应该被留空。
blank.lines.skip # 逻辑词;为TRUE,忽略空白行。
comment.char # 默认情况下,comment.char把符号"#"后的任何文字当作注释;
# 可以改变comment.char = "符号"来改变注释字符;
# 如果数据中不包括任何注释,设置comment.char=""可以加快读取速度。
flush # 逻辑词;在所有字段都已读入的情况下,是否应该跳到下一行。
allowEscapes # 逻辑词;设置是否使用转义符(如"\n"表示转一行),还是直接读入。
encoding # 源文件的编码格式
1.2 read.csv()和read.csv2()函数
read.csv()
和read.csv2()
函数是read.table()函数的两种变形,这两个函数除了默认值与read.table()不同以外,其他的用法与read.table()完全相同。
两个函数的用法:
read.csv(file, header = TRUE, sep = ",", quote = "\"",
dec = ".", fill = TRUE, comment.char = "", ...)
read.csv2(file, header = TRUE, sep = ";", quote = "\"",
dec = ",", fill = TRUE, comment.char = "", ...)
从调用格式可看出,与read.table()不同,这两个函数默认参数都是header=TRUE
。
1.3 3个函数的差别
read.table()函数:读取数据的分隔符为空格,小数点用点号"."
;
read.csv()函数:读取数据的分隔符为逗号,小数点用点号"."
;
read.csv2()函数:读取数据的分隔符为分号,小数点用逗号","
。
2. 读取SPSS数据
foreign包中的read.spss()
函数和Hmisc包中的spss.get()
函数都可以导入SPSS数据,函数spss.get()是对read.spss()的一个封装,可以自动设置后者的许多参数,让整个转换过程更加简单一致。
foreign包是基础包,默认安装。
install.packages("Hmisc") # 安装Hmisc包
library(Hmisc) # 加载Hmisc包
mydata "mydata.sav", # mydata.sav是要导入的SPSS数据文件
use.value.labels=TRUE) # 将带有值标签的变量转换为R中相同水平的因子
# mydata是导入后的R数据框名。
2.1 read.spss()函数
read.spss(file, use.value.labels = TRUE, to.data.frame = FALSE,
max.value.labels = Inf, trim.factor.names = FALSE,
trim_values = TRUE, reencode = NA, use.missings = to.data.frame,
sub = ".", add.undeclared.levels = c("sort", "append", "no"),
duplicated.value.labels = c("append", "condense"),
duplicated.value.labels.infix = "_duplicated_", ...)
## 部分参数释义
file # 要读取的sav数据格式(将文件名包含在""内);
# 如果文件不在工作目录,可能需要写入全部文件路径。
use.value.labels 逻辑词;默认为TRUE,表示将带有值标签的变量转换为R中的因子;
# 为FALSE,则不转化为因子。
to.data.frame # 逻辑词;默认为FALSE,将数据读入到列表中;
# 为TRUE,则将数据读入到数据框中。
2.2 spss.get()函数
spss.get(file, lowernames=FALSE, datevars = NULL,
use.value.labels = TRUE, to.data.frame = TRUE,
max.value.labels = Inf, force.single=TRUE,
allow=NULL, charfactor=FALSE, reencode = NA)
## 部分参数释义
file # 要读取的sav数据格式(将文件名包含在""内);
# 也可以是网络上的数据文件,以"http:/"或"https://"格式表示;
lowernames # 逻辑词;为TRUE时将变量名称转换为小写;
datevars # 一个向量;指定哪些变量需要转换为R内部日期格式;
use.value.labels # 逻辑词;默认TRUE,表示将带有值标签的变量转换为R中的因子;
# 为FALSE,则不转化为因子。
to.data.frame # 逻辑词;默认为FALSE,将数据读入到列表中;
# 为TRUE,则将数据读入到数据框中。
allow # 字符向量,默认情况下,变量名称中的下划线"_"将转换为点"."。
3. 读取Stata数据
可以使用read_stata()函数将stata数据导入到R中,调用格式为:
read_stata(path,atomic.to.fac = FALSE,drop.labels = FALSE,
enc = NULL,verbose = FALSE)
## 参数解释
path # 数据文件的路径
atomic.to.fac # 逻辑词,如为TRUE,则将数据集中的分类变量转换为因子
drop.labels # 逻辑词,如为TRUE,将删除没有使用的值标签
enc # 数据文件的字符编码
verbose # 逻辑词,如为TRUE,将显示导入数据的进度条
4. 读取SAS数据
从SAS文件读入数据的方法有很多,常用比较可靠的方法是在SAS中使用PROC EXPORT将SAS数据集保存为一个逗号分隔的文本文件,再使用read.table()或read.csv()函数读取。
SAS程序:
libname datadir "C:\mydata";
proc export data=datadir.clients
outfile="clients.csv"
dbms=csv;
run;
R程序:
mydata "clients.csv",
header=TRUE,
sep=",")
也可以使用foreign包的read.ssd()函数或Hmisc包的sas.get()函数读取。
5. 导出R中的数据
R可以将R数据对象(通常是数据框或矩阵)导出到文本文件。
常用的函数为write.table()函数。
write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
eol = "\n", na = "NA", dec = ".", row.names = TRUE,
col.names = TRUE, qmethod = c("escape", "double"),
fileEncoding = "")
### 部分参数解释
x # 要导出的R中的对象
file # 字符值,要导出的R对象的文件名称
append # 逻辑词;为TRUE则将输出数据添加到现有文件的结尾;
# 为FALSE则覆盖这个文件。
quote # 逻辑词,默认为TRUE,表示将字符或因子值放入引号中;
# 或为数值向量,指定哪些变量应该放在引号中
sep # 字符值,设置一行中分隔值的字符
eol # 字符值,设置放置在每行结尾处的字符
na # 表示缺失值NA的字符
dec # 表示小数点的字符
row.names # 逻辑词,默认为TRUE,设置输出中是否应该包括行名称;
# 或数值向量,设置哪些行的名称应该输出
col.names # 逻辑词,默认为TRUE,设置输出中是否应该包括列名称;或字符向量,设置列名称
qmethod # 设置如何处理引用字符和因子字段中的引号。
# "escape"表示用反斜杠转义引号;double表示将引号转义为双引号(即把"转换成"")
参考资料
- [美]Robert I. Kabacoff著.R语言实战(第2版)[M].王小宁等译.北京:人民邮电出出版社.2016.
- 各函数R帮助文档