R语言入门:因子的使用

在R语言当中有因子这个特殊的数据结构,和别的编程语言不同,这个数据结构的主要目的是用来分类,计算频数和频率,在后期将R语言用于统计学当中将会十分受用。并且在绘图当中,我们使用同样的数据,将其转化为因子之后,在将这些数据放入绘制图像的函数当中,图像将会变得更加具有可读性。我们有两种方式来创建因子这个数据结构,第一种是在数据框当中自动创建,另一种方式是直接创建因子。

一.利用数据框创建因子

第一种方式是使用间接的方式来创建因子数据集,因为我们数据框当中如果某一列的数据全部都是字符串,那么R语言将会自动将这一列的数据默认为因子。我们来创建一个数据框看看:

> data<-data.frame(name=c("bob","mike","iris"),height=c(178,356,131),gender=c(\'f\',\'m\',\'f\'))
> data
  name height gender
1  bob    178      f
2 mike    356      m
3 iris    131      f

很显然,我们所创建的数据框,除了height,其他两列的数据都是字符串,因此R语言会将gender和name默认是因子,我们可以尝试使用class来判断数据的类型:

> class(data$gender)
[1] "factor"
> class(data$name)
[1] "factor"
> class(data$height)
[1] "numeric"

我们打印一下hieght:

> data$height
[1] 178 356 131

R语言很显然给我们输出了height所对应数据的值,那么对于因子数据会不会也是这样呢?我们来看看打印出gender的值是怎样的:

> data$gender
[1] f m f
Levels: f m

可以从上面看到在打印gender的时候,R语言还显示出了level,这表示这个因子数据当中的数据有哪些类型,我们只有两种性别,因此只会输出 f 和 m 。

下面再来看看name的level如何:

> data$name
[1] bob  mike iris
Levels: bob iris mike

这三个姓名是各不相同的,因此会打印出不同的三个姓名level。

当然我们也可以直接使用level函数来查看因子当中的level,不是因子数据则会输出null,如下所示:

> levels(data$height)
NULL
> levels(data$gender)
[1] "f" "m"
> levels(data$name)
[1] "bob"  "iris" "mike"

nlevel函数用来查看因子数据level的长度:

> nlevels(data$name)
[1] 3

二.利用factor函数直接创建因子

我们创建一个有关性别的因子:

> sex=factor(c(\'f\',\'m\',\'f\',\'f\',\'m\'),levels=c(\'f\',\'m\'),labels=c(\'female\',\'male\'),ordered=TRUE)
> sex
[1] female male   female female male  
Levels: female < male

在上面的代码当中,向量c代表了因子当中的数据集,levels代表了我们人为设定的level,当然即使不写这个,factor函数也会自动帮我们进行设定,但是这里为了和后面的labels相对应,因此必写。labels表示我们因子创建完毕后,每个因子重新命名后的名字,因为之前在创建因子的时候为了数据的简便性就没有将其英语单词写全,ordered表示因子的level按照顺序排列,一般在R语言当中,首先在level当中出现的因子向量,这里是“f”,其顺序会优先于“m”。下面是不设定顺序因子的情况:

> sex<-factor(c(\'f\',\'f\',\'m\',\'m\'),labels=c("female","male"))
> sex
[1] female female male   male  
Levels: female male

我们利用is.ordered函数来查看因子是否具有顺序:

> is.ordered(sex)
[1] FALSE

很显然这是没有顺序的,因此我们可以用ordered函数令他具有顺序,如果使用了这个函数,那么因子当中首先出现的level将小于后出现的level:

> ordered(sex)
[1] female female male   male  
Levels: female < male

这就是今天介绍的有关因子的全部知识了!希望你都能够掌握,并慢慢熟练起来!