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