R中的数据结构 (data structures) 包含:
向量(vector):用于储存数值型、字符型或逻辑型数据的一维数组
矩阵(matrix):二维数组,每个元素拥有相同模式
数组(array):与矩阵类似,但维度可以大于2
数据框(data frame):不同列可包含不同模式数据,为最常见的数据结构
因子(factor):分类变量,包含名义变量和顺序变量两类
列表(lists): 一些对象的有序集合,可包含向量、矩阵、数据框等
向量可能长这样,只有一个维度,下图是一个数值型向量
因子类似于向量,但取值是有限的,比如下图包含F女性和M男性,只有两个水平
矩阵是两维的,下图是一个数值型矩阵。多个相同长度的向量可组合成一个矩阵,但包含的数据类型必须一致
数据框可包含多种不同类型的向量,下图的第一列是数值型,第二列是因子型,第三列是字符型
列表是数据结构的集合,和数据框类似,但每列包含的向量长度可以不同
有了以上的概念后,下面介绍因子factor在R中的一些基本操作
类别变量(categorical variables)或者叫分类变量在R中被称为factor,比如“性别”便是分类变量,包含“男”和“女”两个水平。
# 性别向量
gender_vector "Male", "Female", "Female", "Male", "Male")
用class()查看该向量的种类
class(gender_vector)
[1] "character"
显示gender_vector为字符型(character),下面使用factor()将其转换为factor
# 转换为factor类型
factor_gender_vector
factor_gender_vector
[1] Male Female Female Male Male
Levels: Female Male
可以看到转换后,系统便可以识别该向量的两个水平(Levels)为Female和Male
但类别变量也分两种:
称名变量或名义变量(nominal categorical variable)
顺序变量或有序变量(ordinal categorical variable)
名义变量没有顺序,如动物包含蜥蜴、大象、狮子和蛇,它们之间并没有顺序或高下之分。
animals_vectors "蜥蜴","大象","狮子","蛇")
factor_animals_vector factor_animals_vector
[1] 蜥蜴 大象 狮子 蛇
Levels: 大象 蛇 狮子 蜥蜴
顺序变量有次序之分,如温度包含低中高三种,高排在中或低前面
temperature_vector "高","低","中","低","高")
factor_temperature_vector "低","中","高"))
factor_temperature_vector
[1] 高 低 中 低 高
Levels: 低
如果拿到数据时,类别变量已经是factor类型,并且包含特定顺序的水平,而我们想改变水平的名称,可以使用levels()
levels(factor_gender_vector)
[1] "Female" "Male"
“性别”变量的水平是“Female”“Male”,为什么不是“Male”“Female”呢?
这是因为R默认按照字母顺序表排列,F在M之前
我们可以通过用levels()改变这一顺序
levels(factor_gender_vector) "Male","Female")
levels(factor_gender_vector)
[1] "Male" "Female"
用summary()查看数据摘要
summary(factor_gender_vector)
Male Female
2 3
可以看出该向量包含男性2人,女性3人
著名数据集iris中的Species(花的种类)便是factor型,可以用str()查看iris数据集的基本结构,可看到最后一列变量Species是个分类变量,包含3个水平
str(iris)
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
有时我们画散点图的时候,很想看不同类别的数据表现是否有区别
如钻石数据diamonds,包含克拉、价格(美元)、成色等,我们想知道克拉和价格的关系
可以看出该数据集中的成色color变量是一个顺序变量,包含7个水平,J是最差的成色,D是最好的成色
str(diamonds)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 53940 obs. of 10 variables:
$ carat : num 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
$ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..:>5 4 2 4 2 3 3 3 1 3 ...
$ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..:>2 2 2 6 7 7 6 5 2 5 ...
$ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..:>2 3 5 4 2 6 7 3 4 5 ...
$ depth : num 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
$ table : num 55 61 65 58 58 57 57 55 61 61 ...
$ price : int 326 326 327 334 335 336 336 337 337 338 ...
$ x : num 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
$ y : num 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
$ z : num 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
使用ggplot2包中的qplot(),用法很简单,第一个参数填自变量,第二个参数填因变量,第三个参数填数据
qplot(carat, price, data = diamonds)
很显然,钻石越重,价格越高。但如果我们想要在图中看到不同成色的钻石其克拉和价格的关系是怎样的,又该如何操作呢?
只需要在qplot()中加入一个color参数即可,设置color为根据diamonds数据集中的成色变量进行绘图
qplot(carat, price, data = diamonds, color = diamonds$color)
此时,不同成色的钻石数据采用了不同的颜色绘制,便于我们更直观地找出一些insight。