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