大数据|R语言——数据格式和数据读取

R语言——数据读取之详解

福尔·摩斯曾说过:“数据,数据,没有数据的推理是罪恶!”
不过比起有意思的统计分析,数据的导入与导出显得十分的无趣,但是不得不说统计分析的数据导入与导出是个让人沮丧的任务,而且耗时巨大。
今天分享的是R数据的储存数据格式,及其R中数据的输出与一些特定格式的数据读入。
一、数据集结构
数据集是由数据构成的一个矩形数组,行表示观测,列表示变量。
R拥有的数据结构有:
类型 特点
标量 只含一个元素的向量
向量 用于储存数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可以用来创建向量
矩阵 二维数组,只是每个元素都有相同的模式(数值型、字符型或逻辑型)。可以通过matrix()创建矩阵
数组 矩阵类似,但维度可以大于2,可以通过array创建一个数组
数据框 比矩阵更为一般。数据框是你会在R中最常见的数据结构。、数据框可以通过命令data.frame()创建
因子 类别(名义型)变量和有序类别(有序型)变量
列表 R数据类型中最为复杂的一种。列表就是一些对象的有序结合,允许你整合若干对象到单个对象名下。可以使用list()创建列表
在R中,对象(object)是指可以赋值给变量的任何事物;数据框(data frame)是R中用于储存数据的一种结构:列表示标量,行表示观测;因子(factor)是名义型标量或有序变量。
(一)向量和标量
向量是用于储存数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可以用来创建向量:
a <- c(1, 2, 5, 3, 6, -2, 4) b <- c("one", "two", "three") c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)

标量是只含一个元素的向量,例如
f <- 3 g <- "US" h <- TRUE

过在方括号中给定元素所处的位置的数值,可以访问向量中的元素,例如:
a <- c("k", "j", "h", "a", "c", "m") a[3]

大数据|R语言——数据格式和数据读取
文章图片

最后一个语句中使用的冒号用于生成一个数值序列,例如a <- c(2:6)等价于a <- c(2, 3, 4, 5, 6)
(二)矩阵
矩阵是一个二维数组,只是每个元素都有相同的模式(数值型、字符型或逻辑型)。可以通过matrix()创建矩阵,一般使用格式为:
mymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns, byrow=logical_value, dimnames=list(char_vector_rownames, char_vector_colnames))

其中,vector包含了矩阵的元素,nrow和ncol用以指定行和列的维数,dimnames包含了可选的、以字符型向量表示的行名和列名。选项byrow则表明矩阵以行填充还是以列填充,默认情况下按行填充(TRUE)。
y <- matrix(1:20, nrow = 5)#创建矩阵 y

大数据|R语言——数据格式和数据读取
文章图片

cells <- c(1,26,24,28) rnames <- c("R1", "R2") cnames <- c("C1", "C2") mymatrix <- matrix(cells, nrow = 2, dimnames = list(rnames, cnames))#创建矩阵 mymatrix

大数据|R语言——数据格式和数据读取
文章图片

我们可以用下标和方括号来选择矩阵中的行和列。X[i,]指定X中的第i行,X[,j]指定X中的第j列。X[i,j]指定第i行第j列个元素。选择多个行和列时,下标i和j可以为数值型向量。
x <- matrix(1:10, nrow = 2, ncol = 5)#创建矩阵 x x[2,]#提取第二行数据 x[,3]#提取第三列数据 x[1, c(4,5)]#提取第一行第四、五列数据

大数据|R语言——数据格式和数据读取
文章图片

矩阵都是二维的,和向量类似,矩阵也只能包含一种数据结构。当维度超过2时,可以考虑使用数组;当数据类型超过1种时,可以考虑使用data frame。
(三)数组
【大数据|R语言——数据格式和数据读取】数组与矩阵类似,但维度可以大于2,可以通过array创建一个数组:
myarray <- array(vector, dimensions, dimnames)

其中,vector包含了数组中的数据;dimensions是一个数值型向量,给出了维度下标的最大值;dimnames是可选的:
dim1 <- c("A1", "A2") dim2 <- c("B1", "B2", "B3") dim3 <- c("C1", "C2", "C3", "C4") z <- array(1:24, c(2,3,4), dimnames = list(dim1, dim2, dim3)) z

大数据|R语言——数据格式和数据读取
文章图片

可见,数组只是矩阵的自然推广,而且数据结构也只能有一种。
(四)数据框
由于不同列可以包含不同模式的数据,数据框的概念比矩阵更为一般。数据框是你会在R中最常见的数据结构。、
数据框可以通过命令data.frame()创建:
mydata <- data.frame(col1, col2, col3,...)

其中的列向量col1、col2、col3可以为任何类型(字符、数值、逻辑)。每一列的列名可以用函数names指定:
patientID <- c(1, 2, 3, 4) #每列数据 age <- c(24, 34, 28, 52) diabetes <- c("Type1", "Type2", "Type1", "Type1") status <- c("Poor", "Improve", "Excellent", "Poor") patientdata <- data.frame(patientID, age, diabetes, status) patientdata

大数据|R语言——数据格式和数据读取
文章图片

其中,每一列的数据类型必须一样,但不同列的可以不一样。为了方便讨论,数据框的列有时候被称为变量。
选取数据框的元素有很多种。你可以使用前面提到的方括号的方法,也可以直接指定列名:
patientdata[1:2,]#提取第1,2行数据 patientdata[,1:2]#提取第1,2列数据 patientdata[c("diabetes", "status")]#根据列名提取数据

大数据|R语言——数据格式和数据读取
文章图片

你也可以使用记号 $ 来选取一个给定数据框中的某个特定的变量:
patientdata$age table(patientdata$diabetes, patientdata$status)#生成糖尿病类型diabetes和病情status的列联表

大数据|R语言——数据格式和数据读取
文章图片

(五)因子
变量了可以归结为名义型、有序型或连续型。
  • 名义型变量是没有顺序之分的类别变量,例如糖尿病类型Diabetes(Type1, Type2),即使在数据中前者编码为1、后者编码为2,也不意味着二者是递进关系。
  • 有序型变量是有顺序之分的类别变量,例如病情Status(poor, improved, excellent)。
  • 连续型变量可以呈现为一种某个范围的任意值。例如年龄(1,2,3,4…),身高(176,177,178,…)等
在R中,**类别(名义型)变量和有序类别(有序型)变量均称为因子(factor)。**因子非常重要,它决定了数据的分析方式和视觉呈现效果。
函数factor()以一个整数向量的形式存储类别值,整数的取值范围为[1,…,k],同时一个由字符串组成的内部向量将映射到这些整数上。例如:
diabetes <- c("Type1", "Type2", "Type1", "Type1") diabetes <- factor(diabetes)#创建因子 class(diabetes)#识别数据类型 diabetes

大数据|R语言——数据格式和数据读取
文章图片

将此向量储存为(1,2,1,1),并在内部将其关联为“Type1=1”、“Type2=2”。针对diabetes的任何分析都会将其作为名义型变量对待。
要表示有序变量,则需要使用factor()函数内的ordered=TRUE,例如:
status <- c("Poor", "Improve", "Excellent", "Poor") status <- c(status, ordered=TRUE) status

大数据|R语言——数据格式和数据读取
文章图片

会把status编码为(3, 2, 1, 3)。对于字符型向量,因子水平默认按照字母顺序创建,即“Poor=3”、“Improved=2”、“Excellent=1”。你也可以通过levels改变因子的顺序
status <- c("Poor", "Improve", "Excellent", "Poor") status <- c(status, ordered=TRUE, levels=c("Poor", "Improved", "Excellent")) status

大数据|R语言——数据格式和数据读取
文章图片

那么就会将status编码为:“Poor=1”、“Improved=2”、“Excellent=3”
数值型变量可以用levels和labels来编码因子,例如男性编码为1,女性编码为2,那么:
sex <- facotr(sex, levels=c(1,2), labels=c("Male", "Female"))

把变量了转换成一个无序因子。
(六)列表
列表(list)是R数据类型中最为复杂的一种。列表就是一些对象的有序结合,允许你整合若干对象到单个对象名下。可以使用list()创建列表:
mylist <- list(object1, object2, ...)

其对象可以是目前为止提到的任何结构。还可以为列表中的对象命名:
mylist <- list(name1=object1, name2=object2, ...)

g <- "My First List" h <- c(25:30) j <- matrix(c(1:10), nrow = 2) k <- c("one", "two", "three") mylist <- list(title=g, h, matrix=j, English=k) mylist

大数据|R语言——数据格式和数据读取
文章图片

可以通过双重括号指明某个成分的数字或名称来访问列表中的元素,例如mylist[[3]]和mylist[[“matirx”]]均表示mylist的第三个元素。对于命名的成分,也可以用mylist$matrix来进行引用,例如:
mylist[[3]]#按列表数提取 mylist[["matrix"]]#按列表名称提取 mylist$matrix#按列表名称提取

大数据|R语言——数据格式和数据读取
文章图片

R中有很多函数的运行结果都是以列表的形式返回的,这是一个十分重要的数据结构。
二、读取文件 对于在文件读取和写入的工作,R使用工作目录来完成。
  • 可以使用命令getwd() (获得工作目录)来找到目录,
  • 使用命令setwd(“C:/data”) 或setwd("/home/paradis/R") 来改变目录。如果一个文件不在工作目录里则必须给出它的路径。
R可以用下面的函数读取存储在文本文件(ASCII)中的数据:read.table(其中有若干参数,见后文),scan和read.fwf。R也可以读取以其他格式的文件(Excel,SAS, SPSS, . . . ) 和访问SQL类型的数据库,但是基础包中并不包含所需的这些函数。这些功能函数对于R的高级应用是十分有用的,但是我们在这里将读取文件限定在ASCII格式。
R语言可以从键盘、文本文件、Excel和Access、流行的统计软件、特殊格式的文件、多种关系型数据库管理系统、专业数据库、网站和在线服务中导入数据。如下图所示:
大数据|R语言——数据格式和数据读取
文章图片

(一)使用键盘输入数据
适用于处理小数据集
1.创建一个空数据框(矩阵),其中变量名和变量的模式需与理想中的最终数据集一致;
2. 针对这个数据对象调用数据编辑器,输入数据,关闭界面,结果就会保存此数据对象中;
mydata<-data.frame()#创建空的数据框 mydata<-edit(mydata)#召唤编辑面板

大数据|R语言——数据格式和数据读取
文章图片

在召唤的面板上,修改列名和填充数据;
大数据|R语言——数据格式和数据读取
文章图片

大数据|R语言——数据格式和数据读取
文章图片

(二)从文件中导入数据
第一步,是学会设置路径。
这里使用的函数为setwd()。比如我们如果想读取位于桌面上的data.txt,那么我们就要将路径设置到桌面上,
对于windows而言,即是设置到C:\Users\Li\Desktop这个位置。但是需要注意的是,在R语言中,我们必须将路径中所有的“\”换成“/”,最终代码便是:
setwd("C:/Users/li/Desktop")

第二步,读取各种类型的文件的函数。
下面我们将介绍常见的各种类型文件的读取方法:
文件类型 函数名称 命令
csv文件 read.csv df <- read.csv(“dataset.csv”,header=T,as.is=T)
txt 文件 read.table df <- read.table(“dataset.txt”, as.is=TRUE, header=T)
xls文件 read.xls df <- read.xls(“dataset.csv”,header=T)
R 文件 load load(“mydata.Rdata”)
spss文件 read.spss df <- read.spss(“dataset.sav”, use.value.label=TRUE, to.data.frame=TRUE)
stata文件 read.dta df <- read.dta(“dataset.dta”)
SAS文件 无直接读取函数
剪切板 scan df<-scan()
xlsx文件 read.xlsx read.xlsx(“dataset.csv”,header=T)
读取xls格式,通常最简单的办法,是将xls用excel打开另存为csv格式文件,然后用1中所介绍方法打开。
其中read.table\read.csv函数的特征
大数据|R语言——数据格式和数据读取
文章图片

其中几类R包需要调用
可以加载gdata包,调用 read.xls
可以加载foreign包,调用read.spss和read.dta
可以加载rJava,xlsxjars和xlsx包,调用read.xlsx
下载和安装rJava,xlsxjars和xlsx包,目前在载入rJava包(library rJava)的时候,会发生错误
大数据|R语言——数据格式和数据读取
文章图片

提示我们需要处理JAVA的环境,首先下载jre(我这里下载的是windows版 64位 jre-8u121-windows-x64.exe),然后默认安装jre就好了,JAVA_HOME就自动帮我们配置到环境变量中。然后依次载入rJava,xlsxjars和xlsx包,都成功了。
install.packages("gdata")#下载gdata包 library(gdata)#加载R包,调用函数

SAS文件读取
读取SAS文件
首先在SAS中输入如下代码,将其转化为CSV格式。
proc export data=https://www.it610.com/article/dataset
outfile=“datast.csv”
dbms=csv;
run;
(三)从网上读取数据(通过read.table或用爬虫抓取)
用read.table函数,举个例子:
data<-read.table(“http://lib.statNaNu.edu/datasets/csb/ch3a.dat”)
此外还可以通过爬虫爬区数据,一般使用的是Rcurl和XML包,非本系列重点,故不展开讲
(四)使用R中自带数据集
下面整理了R中的全部自带数据集,来源于网络,方便读者的自行练习数据挖掘的算法。这些数据集的读取方法直接命名或使用,如volcano数据集,可以直接将其赋给df:
df <- volcano

具体数据集如下所示:
1、向量类型数据集
数据集名称 数据集说明
uro 欧元汇率,长度为11,每个元素都有命名
landmasses 48个陆地的面积,每个都有命名
precip 长度为70的命名向量
rivers 北美141条河流长度
state.abb 美国50个州的双字母缩写
state.area 美国50个州的面积
state.name 美国50个州的全称
2、因子
数据集名称 数据集说明
state.division 美国50个州的分类,9个类别
state.region 美国50个州的地理分类
3、矩阵、数组
数据集名称 数据集说明
euro.cross 11种货币的汇率矩阵
freeny.x 每个季度影响收入四个因素的记录
state.x77 美国50个州的八个指标
USPersonalExpenditure 5个年份在5个消费方向的数据
VADeaths 1940年弗吉尼亚州死亡率(每千人)
volcano 某火山区的地理信息(10米×10米的网格)
WorldPhones 8个区域在7个年份的电话总数
iris3 3种鸢尾花形态数据
Titanic 泰坦尼克乘员统计
UCBAdmissions 伯克利分校1973年院系、录取和性别的频数
crimtab 3000个男性罪犯左手中指长度和身高关系
airEyeColor 592人头发颜色、眼睛颜色和性别的频数
occupationalStatus 英国男性父子职业联系
4、类矩阵
数据集名称 数据集说明
eurodist 欧洲12个城市的距离矩阵,只有下三角部分
Harman23.cor 305个女孩八个形态指标的相关系数矩阵
Harman74.cor 145个儿童24个心理指标的相关系数矩阵
5、数据框
数据集名称 数据集说明
airquality 纽约1973年5-9月每日空气质量
anscombe 四组x-y数据,虽有相似的统计量,但实际数据差别较大
attenu 多个观测站对加利福尼亚23次地震的观测数据
attitude 30个部门在七个方面的调查结果,调查结果是同一部门35个职员赞成的百分比
beaver1 一只海狸每10分钟的体温数据,共114条数据
beaver2 另一只海狸每10分钟的体温数据,共100条数据
BOD 随水质的提高,生化反应对氧的需求(mg/l)随时间(天)的变化
cars 1920年代汽车速度对刹车距离的影响
chickwts 不同饮食种类对小鸡生长速度的影响
esoph 法国的一个食管癌病例对照研究
faithful 一个间歇泉的爆发时间和持续时间
Formaldehyde 两种方法测定甲醛浓度时分光光度计的读数
Freeny 每季度收入和其他四因素的记录
dating from 配对的病例对照数据,用于条件logistic回归
InsectSprays 使用不同杀虫剂时昆虫数目
ris 3种鸢尾花形态数据
LifeCycleSavings 50个国家的存款率
longley 强共线性的宏观经济数据
morley 光速测量试验数据
mtcars 32辆汽车在11个指标上的数据
OrchardSprays 使用拉丁方设计研究不同喷雾剂对蜜蜂的影响
PlantGrowth 三种处理方式对植物产量的影响
pressure 温度和气压
Puromycin 两种细胞中辅因子浓度对酶促反应的影响
quakes 1000次地震观测数据(震级>4)
randu 在VMS1.5中使用FORTRAN中的RANDU三个一组生成随机数字,共400组。
rock 48块石头的形态数据
sleep 两药物的催眠效果
stackloss 化工厂将氨转为硝酸的数据
swiss 瑞士生育率和社会经济指标
ToothGrowth VC剂量和摄入方式对豚鼠牙齿的影响
trees 树木形态指标
USArrests 美国50个州的四个犯罪率指标
USJudgeRatings 43名律师的12个评价指标
warpbreaks 织布机异常数据
women 15名女性的身高和体重
6、列表
数据集名称 数据集说明
state.center 美国50个州中心的经度和纬度
7、类数据框
数据集名称 数据集说明
ChickWeight 饮食对鸡生长的影响
CO2 耐寒植物CO2摄取的差异
DNase 若干次试验中,DNase浓度和光密度的关系
Indometh 某药物的药物动力学数据
Loblolly 火炬松的高度、年龄和种源
Orange 桔子树生长数据
Theoph 茶碱药动学数据
8、时间序列数据
数据集名称 数据集说明
airmiles 美国1937-1960年客运里程营收(实际售出机位乘以飞行哩数)
AirPassengers Box & Jenkins航空公司1949-1960年每月国际航线乘客数
austres 澳大利亚1971-1994每季度人口数(以千为单位)
BJsales 有关销售的一个时间序列
BJsales.lead 前一指标的先行指标(leading indicator)
co2 1959-1997年每月大气co2浓度(ppm)
discoveries 1860-1959年每年巨大发现或发明的个数
ldeaths 1974-1979年英国每月支气管炎、肺气肿和哮喘的死亡率
fdeaths 前述死亡率的女性部分
mdeaths 前述死亡率的男性部分
freeny.y 每季度收入
ohnsonJohnson 1960-1980年每季度Johnson & Johnson股票的红利
LakeHuron 1875-1972年某一湖泊水位的记录
lh 黄体生成素水平,10分钟测量一次
lynx 1821-1934年加拿大猞猁数据
nhtemp 1912-1971年每年平均温度
Nile 1871-1970尼罗河流量
nottem 1920-1939每月大气温度
presidents 1945-1974年每季度美国总统支持率
UKDriverDeaths 1969-1984年每月英国司机死亡或严重伤害的数目
sunspot.month 1749-1997每月太阳黑子数
sunspot.year 1700-1988每年太阳黑子数
sunspots 1749-1983每月太阳黑子数
treering 归一化的树木年轮数据
UKgas 1960-1986每月英国天然气消耗
USAccDeaths 1973-1978美国每月意外死亡人数
uspop 1790–1970美国每十年一次的人口总数(百万为单位)
WWWusage 每分钟网络连接数
Seatbelts 多变量时间序列。和UKDriverDeaths时间段相同,反映更多因素。
EuStockMarkets 多变量时间序列。欧洲股市四个主要指标的每个工作日记录,共1860条记录。
三、附录信息 关于包的安装、加载及更新、卸载:
R包名称 作用
update.packages() 查看可更新包
install.packages(“ggplot2”) 安装下载工具包
library(ggplot2) 加载下载工具包
detach(“ggplot2”) 分离包(从内存空间中移除)remove.packages(“ggplot2”)
关于R语言软件的更新:
R包名称 作用
install.packages(“installr”) 下载安装工具包
library(installr) 加载安装工具包
check.for.updates.R() 检测是否有最新版的R软件
installr() 下载并安装新版R软件
copy.packages.between.libraries() 复制旧版R中的包到新版R中

    推荐阅读