![大数据分析与应用实战:统计机器学习之数据导向编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/943/44509943/b_44509943.jpg)
1.3.5 数据集
数据集与1.3.2节矩阵一样都是具有行及列的二维结构,但是数据集允许各纵向字段有不同的数据类型,它类似其他统计软件SAS、SPSS与Stata中的数据集(data set或dataset),以及Python语言pandas包的DataFrame对象(参见1.4.2节Python语言衍生数据对象取值),也是我们在R中最常遇到的数据对象。套件{UsingR}中有一个数据集对象crime,它是美国50州的暴力犯罪率数据。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P45_19859.jpg?sign=1739087365-dBFt8NgPyTMzOxzl7D3A9y3Ad0xICFxI-0-f3cdbc0a7ab943963869f554fa56e76e)
因为都是二维结构,所以数据集外表上与矩阵看来非常相似。但是数据集本质上是以列表方式存储的,也就是说,数据集是各列向量(即各变量)均等长的列表结构,因此可用矩阵的方式来呈现。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P46_19860.jpg?sign=1739087365-BS7D3NMCpsk0tTQsTAwJWfBFvnaD2MnS-0-7a056c97e05fa170710c01face40f4e9)
names()函数将crime视为一维列表返回其元素名称,因此,数据分析师经常以此取得数据集的变量名称。dimnames()则返回crime矩阵下的行名与列名,反而比较少用。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P47_19863.jpg?sign=1739087365-BaDsCY9jODfWW23bySgPWa0oRIEXZNIY-0-5dabbb63fd9761a84e704555a57f6495)
前述数据集各字段都是数值类型,因此也可以存为matrix,两者显示的结果完全相同,因此建议读者要认真查看数据对象的类型,以避免使用R函数时传入不正确的类型,产生不必要的错误,Python语言亦是如此。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P47_19864.jpg?sign=1739087365-vxcevCnj8dml7HklqBiT1s0XA6Sg0hWk-0-35f322cc60005a4c6704d435779292c1)
再举一个各纵向字段有不同数据类型的R数据集,套件{MASS}中有一数据集Cars,它记录了93种汽车于1993年在美国的销售量,从str()函数返回的结果,我们可以看出其域类型有因子、整数及数值型等。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P48_19866.jpg?sign=1739087365-tfWbYvertoe2wxDrugbSdJvRq3BSwp5k-0-3f3cca013006ef9b30b371b8f4b6acc0)
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P49_1848.jpg?sign=1739087365-WRn7maIwu4uvQwz0XdLDfwkWLFWZ8O8i-0-29ef7350c0f28723e11a05e996ee592a)
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P50_19867.jpg?sign=1739087365-Rnm9elbn7HtSL5O79PGTjL6VrxRhjE9n-0-502d9315b8a9272d14767ad603c7a692)
此时将Cars93转为matrix类型时,会把值类型的字段变成字符串类型(有双引号),我们要注意前述数据类型在后台自动(强制)转换的现象。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P50_19868.jpg?sign=1739087365-zgT0DkJ89x4LgEyU83H6sR4uW8EQOJ92-0-dae88db8f9060ba6dd620cdd6bc88b9c)
· 数据集创建函数是data.frame(),语法如下:
mydata<-data.frame(域名1=向量1,域名2=向量2,…)
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P51_19872.jpg?sign=1739087365-NRkqdP7rufOQqKL8KUpNZ43zcCJXWTfT-0-c76f4e22c975a004bb0cf0e5a235fd16)
从上例中可以看出,数据集字段若未给定名称,R语言会根据传入的向量名称自动产生各域名。此外,建立数据集时,默认会将字符串变量转为因子变量(或称因子向量)(参见1.3.6节因子),用户如果需要保留字符串类型,可以通过参数stringsAsFactors=F改变默认的设定。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P51_19873.jpg?sign=1739087365-LMMsTz4jsiJzo4CFKBimFQrNEclMpERt-0-b201f0f88dfa6c01ddc925e9bbdcdb1b)