R语言——数据读取之详解
福尔·摩斯曾说过:“数据,数据,没有数据的推理是罪恶!”不过比起有意思的统计分析,数据的导入与导出显得十分的无趣,但是不得不说统计分析的数据导入与导出是个让人沮丧的任务,而且耗时巨大。
今天分享的是R数据的储存数据格式,及其R中数据的输出与一些特定格式的数据读入。
一、数据集结构
数据集是由数据构成的一个矩形数组,行表示观测,列表示变量。R拥有的数据结构有:
类型 | 特点 |
---|---|
标量 | 只含一个元素的向量 |
向量 | 用于储存数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可以用来创建向量 |
矩阵 | 二维数组,只是每个元素都有相同的模式(数值型、字符型或逻辑型)。可以通过matrix()创建矩阵 |
数组 | 矩阵类似,但维度可以大于2,可以通过array创建一个数组 |
数据框 | 比矩阵更为一般。数据框是你会在R中最常见的数据结构。、数据框可以通过命令data.frame()创建 |
因子 | 类别(名义型)变量和有序类别(有序型)变量 |
列表 | R数据类型中最为复杂的一种。列表就是一些对象的有序结合,允许你整合若干对象到单个对象名下。可以使用list()创建列表 |
(一)向量和标量
向量是用于储存数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数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]
文章图片
最后一个语句中使用的冒号用于生成一个数值序列,例如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
文章图片
cells <- c(1,26,24,28)
rnames <- c("R1", "R2")
cnames <- c("C1", "C2")
mymatrix <- matrix(cells, nrow = 2, dimnames = list(rnames, cnames))#创建矩阵
mymatrix
文章图片
我们可以用下标和方括号来选择矩阵中的行和列。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)]#提取第一行第四、五列数据
文章图片
矩阵都是二维的,和向量类似,矩阵也只能包含一种数据结构。当维度超过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中最常见的数据结构。、
数据框可以通过命令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
文章图片
其中,每一列的数据类型必须一样,但不同列的可以不一样。为了方便讨论,数据框的列有时候被称为变量。
选取数据框的元素有很多种。你可以使用前面提到的方括号的方法,也可以直接指定列名:
patientdata[1:2,]#提取第1,2行数据
patientdata[,1:2]#提取第1,2列数据
patientdata[c("diabetes", "status")]#根据列名提取数据
文章图片
你也可以使用记号 $ 来选取一个给定数据框中的某个特定的变量:
patientdata$age
table(patientdata$diabetes, patientdata$status)#生成糖尿病类型diabetes和病情status的列联表
文章图片
(五)因子
变量了可以归结为名义型、有序型或连续型。
- 名义型变量是没有顺序之分的类别变量,例如糖尿病类型Diabetes(Type1, Type2),即使在数据中前者编码为1、后者编码为2,也不意味着二者是递进关系。
- 有序型变量是有顺序之分的类别变量,例如病情Status(poor, improved, excellent)。
- 连续型变量可以呈现为一种某个范围的任意值。例如年龄(1,2,3,4…),身高(176,177,178,…)等
函数factor()以一个整数向量的形式存储类别值,整数的取值范围为[1,…,k],同时一个由字符串组成的内部向量将映射到这些整数上。例如:
diabetes <- c("Type1", "Type2", "Type1", "Type1")
diabetes <- factor(diabetes)#创建因子
class(diabetes)#识别数据类型
diabetes
文章图片
将此向量储存为(1,2,1,1),并在内部将其关联为“Type1=1”、“Type2=2”。针对diabetes的任何分析都会将其作为名义型变量对待。
要表示有序变量,则需要使用factor()函数内的ordered=TRUE,例如:
status <- c("Poor", "Improve", "Excellent", "Poor")
status <- c(status, ordered=TRUE)
status
文章图片
会把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
文章图片
那么就会将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
文章图片
可以通过双重括号指明某个成分的数字或名称来访问列表中的元素,例如mylist[[3]]和mylist[[“matirx”]]均表示mylist的第三个元素。对于命名的成分,也可以用mylist$matrix来进行引用,例如:
mylist[[3]]#按列表数提取
mylist[["matrix"]]#按列表名称提取
mylist$matrix#按列表名称提取
文章图片
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、流行的统计软件、特殊格式的文件、多种关系型数据库管理系统、专业数据库、网站和在线服务中导入数据。如下图所示:
文章图片
(一)使用键盘输入数据
适用于处理小数据集
1.创建一个空数据框(矩阵),其中变量名和变量的模式需与理想中的最终数据集一致;
2. 针对这个数据对象调用数据编辑器,输入数据,关闭界面,结果就会保存此数据对象中;
mydata<-data.frame()#创建空的数据框
mydata<-edit(mydata)#召唤编辑面板
文章图片
在召唤的面板上,修改列名和填充数据;
文章图片
文章图片
(二)从文件中导入数据
第一步,是学会设置路径。
这里使用的函数为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) |
其中read.table\read.csv函数的特征
文章图片
其中几类R包需要调用
可以加载gdata包,调用 read.xls下载和安装rJava,xlsxjars和xlsx包,目前在载入rJava包(library rJava)的时候,会发生错误
可以加载foreign包,调用read.spss和read.dta
可以加载rJava,xlsxjars和xlsx包,调用read.xlsx
文章图片
提示我们需要处理JAVA的环境,首先下载jre(我这里下载的是windows版 64位 jre-8u121-windows-x64.exe),然后默认安装jre就好了,JAVA_HOME就自动帮我们配置到环境变量中。然后依次载入rJava,xlsxjars和xlsx包,都成功了。
install.packages("gdata")#下载gdata包
library(gdata)#加载R包,调用函数
SAS文件读取
读取SAS文件(三)从网上读取数据(通过read.table或用爬虫抓取)
首先在SAS中输入如下代码,将其转化为CSV格式。
proc export data=https://www.it610.com/article/dataset
outfile=“datast.csv”
dbms=csv;
run;
用read.table函数,举个例子:(四)使用R中自带数据集
data<-read.table(“http://lib.statNaNu.edu/datasets/csb/ch3a.dat”)
此外还可以通过爬虫爬区数据,一般使用的是Rcurl和XML包,非本系列重点,故不展开讲
下面整理了R中的全部自带数据集,来源于网络,方便读者的自行练习数据挖掘的算法。这些数据集的读取方法直接命名或使用,如volcano数据集,可以直接将其赋给df:
df <- volcano
具体数据集如下所示:
1、向量类型数据集
数据集名称 | 数据集说明 |
---|---|
uro | 欧元汇率,长度为11,每个元素都有命名 |
landmasses | 48个陆地的面积,每个都有命名 |
precip | 长度为70的命名向量 |
rivers | 北美141条河流长度 |
state.abb | 美国50个州的双字母缩写 |
state.area | 美国50个州的面积 |
state.name | 美国50个州的全称 |
数据集名称 | 数据集说明 |
---|---|
state.division | 美国50个州的分类,9个类别 |
state.region | 美国50个州的地理分类 |
数据集名称 | 数据集说明 |
---|---|
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 | 英国男性父子职业联系 |
数据集名称 | 数据集说明 |
---|---|
eurodist | 欧洲12个城市的距离矩阵,只有下三角部分 |
Harman23.cor | 305个女孩八个形态指标的相关系数矩阵 |
Harman74.cor | 145个儿童24个心理指标的相关系数矩阵 |
数据集名称 | 数据集说明 |
---|---|
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名女性的身高和体重 |
数据集名称 | 数据集说明 |
---|---|
state.center | 美国50个州中心的经度和纬度 |
数据集名称 | 数据集说明 |
---|---|
ChickWeight | 饮食对鸡生长的影响 |
CO2 | 耐寒植物CO2摄取的差异 |
DNase | 若干次试验中,DNase浓度和光密度的关系 |
Indometh | 某药物的药物动力学数据 |
Loblolly | 火炬松的高度、年龄和种源 |
Orange | 桔子树生长数据 |
Theoph | 茶碱药动学数据 |
数据集名称 | 数据集说明 |
---|---|
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包名称 | 作用 |
---|---|
install.packages(“installr”) | 下载安装工具包 |
library(installr) | 加载安装工具包 |
check.for.updates.R() | 检测是否有最新版的R软件 |
installr() | 下载并安装新版R软件 |
copy.packages.between.libraries() | 复制旧版R中的包到新版R中 |
推荐阅读
- postgwas|postgwas r语言_如何用R绘制GWAS研究的Manhattan图及QQ图
- python|python(海龟交易法则 画唐奇安通道)
- 大数据|十年远征(一个云操作系统的光荣与梦想)
- python|第十届泰迪杯数据挖掘大赛B题电力系统负荷预测
- python|python之numpy库--科学计算基础库必学(一)
- 数据科学从0到1|python使用numpy生成指定步长的浮点数序列
- 神经网络|信息瓶颈提出者Naftali Tishby生前指导,129页博士论文「神经网络中的信息流」公布...
- 数据分析|python机器学习之模型选择与优化
- ggplot|R语言ggplot在一张图里同时画散点图和折线图