![大数据分析与应用实战:统计机器学习之数据导向编程](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=1738854428-2iFs7WuDsIdlcQorWdbToB7tgghSBtcE-0-b68bd97d8c4cb27ba0a375caec68d46c)
因为都是二维结构,所以数据集外表上与矩阵看来非常相似。但是数据集本质上是以列表方式存储的,也就是说,数据集是各列向量(即各变量)均等长的列表结构,因此可用矩阵的方式来呈现。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P46_19860.jpg?sign=1738854428-Fjmhlr6s9iVaMRKC8gLF85eU8quWGAUv-0-36951a70133901abe1b5f51ce1eac0fd)
names()函数将crime视为一维列表返回其元素名称,因此,数据分析师经常以此取得数据集的变量名称。dimnames()则返回crime矩阵下的行名与列名,反而比较少用。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P47_19863.jpg?sign=1738854428-Kf4LQq0Z6KtpT9Sg1vyHVTibYQYfnBbG-0-8b17bfad05d25711ff81b8c74a489b15)
前述数据集各字段都是数值类型,因此也可以存为matrix,两者显示的结果完全相同,因此建议读者要认真查看数据对象的类型,以避免使用R函数时传入不正确的类型,产生不必要的错误,Python语言亦是如此。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P47_19864.jpg?sign=1738854428-AsMfWacY07cSMRbj62WoA61dFrpY50fn-0-b0b7d6d07e4159d5f90ccf780808f693)
再举一个各纵向字段有不同数据类型的R数据集,套件{MASS}中有一数据集Cars,它记录了93种汽车于1993年在美国的销售量,从str()函数返回的结果,我们可以看出其域类型有因子、整数及数值型等。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P48_19866.jpg?sign=1738854428-RgUKKuFKN1h7v0o8jZrSsPd89poDXFYB-0-b103b66fcc638126624bb6698536078a)
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P49_1848.jpg?sign=1738854428-f8YVWQzRKvyGbWtOoyEeC5XXbt1A5NI6-0-b890bad32705ee30d703de13c6230524)
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P50_19867.jpg?sign=1738854428-sf686hzdN1TwWIywi5beujP2RSaZAJxj-0-ddec9de1f52a99ff058bc270e9b9142a)
此时将Cars93转为matrix类型时,会把值类型的字段变成字符串类型(有双引号),我们要注意前述数据类型在后台自动(强制)转换的现象。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P50_19868.jpg?sign=1738854428-Cd0qxeCOEKqqXVxYfxBq4qj5DlV1j544-0-bd2287efa95a97bc6ad82fbec4f14918)
· 数据集创建函数是data.frame(),语法如下:
mydata<-data.frame(域名1=向量1,域名2=向量2,…)
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P51_19872.jpg?sign=1738854428-XvrlqDGI442eTsXkhmZzsiAfljMQzsJn-0-85b8305dc92985d618a984a1f8f3c06a)
从上例中可以看出,数据集字段若未给定名称,R语言会根据传入的向量名称自动产生各域名。此外,建立数据集时,默认会将字符串变量转为因子变量(或称因子向量)(参见1.3.6节因子),用户如果需要保留字符串类型,可以通过参数stringsAsFactors=F改变默认的设定。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P51_19873.jpg?sign=1738854428-juY0tBHdxOwpE88SquppSoiwP14iipSb-0-c6d9e1637184d506da13f7839e5fd328)