因子 Factors

通常数据会被分成有限的几个类别,例如在某宝的评价,好评,中评和差评。在R里面,分类数据被存为因子。因子变量在数据分析中非常重要,我们这节课将教大家掌握创建因子变量,取其子集和比较。

什么是因子变量,如何使用它?

欢迎来到奇妙的因子世界!

因子是指我们用来存储分类变量的统计数据类型。分类变量和连续性变量的区别在于分类变量可以被归类到有限个数的类别中。而连续变量则可以对应无限多的数值。

所以呢,我们需要让R知道我们要它处理的是分类变量还是连续变量,这对后面你要做的数据分析和搭建的统计模型都至关重要。

例如性别就是一个分类变量的例子。一般情况下,我们把这个性别类别限制在“male”和“female”。

我们使用factor函数来创建因子变量。 首先你建一个向量,包含一些样本,这些样本属于有限的几个类别。例如,sex_vector contains the sex of 5 different individuals:

sex_vector <- c("Male","Female","Female","Male","Male")

显然,我们这里有两个类别,用R的话说两个factor level,male, female。

函数factor会将一个向量转化成因子:

factor_sex_vector <- factor(sex_vector)

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFNleCB2ZWN0b3JcbnNleF92ZWN0b3IgPC0gYyhcIk1hbGVcIiwgXCJGZW1hbGVcIiwgXCJGZW1hbGVcIiwgXCJNYWxlXCIsIFwiTWFsZVwiKVxuXG4jIENvbnZlcnQgc2V4X3ZlY3RvciB0byBhIGZhY3RvclxuZmFjdG9yX3NleF92ZWN0b3IgPC1cblxuIyBQcmludCBvdXQgZmFjdG9yX3NleF92ZWN0b3IiLCJzb2x1dGlvbiI6IiMgU2V4IHZlY3Rvclxuc2V4X3ZlY3RvciA8LSBjKFwiTWFsZVwiLCBcIkZlbWFsZVwiLCBcIkZlbWFsZVwiLCBcIk1hbGVcIiwgXCJNYWxlXCIpXG5cbiMgQ29udmVydCBzZXhfdmVjdG9yIHRvIGEgZmFjdG9yXG5mYWN0b3Jfc2V4X3ZlY3RvciA8LSBmYWN0b3Ioc2V4X3ZlY3RvcilcblxuIyBQcmludCBvdXQgZmFjdG9yX3NleF92ZWN0b3JcbmZhY3Rvcl9zZXhfdmVjdG9yIn0=

分类变量有两种:名义分类变量(不可区分小大,比较顺序),有序分类变量(可以比较大小,排列顺序)。

点击run,看一看运行结果,试着理解一下?

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIEFuaW1hbHNcbmFuaW1hbHNfdmVjdG9yIDwtIGMoXCJFbGVwaGFudFwiLCBcIkdpcmFmZmVcIiwgXCJEb25rZXlcIiwgXCJIb3JzZVwiKVxuZmFjdG9yX2FuaW1hbHNfdmVjdG9yIDwtIGZhY3RvcihhbmltYWxzX3ZlY3RvcilcbmZhY3Rvcl9hbmltYWxzX3ZlY3RvclxuXG4jIFRlbXBlcmF0dXJlXG50ZW1wZXJhdHVyZV92ZWN0b3IgPC0gYyhcIkhpZ2hcIiwgXCJMb3dcIiwgXCJIaWdoXCIsXCJMb3dcIiwgXCJNZWRpdW1cIilcbmZhY3Rvcl90ZW1wZXJhdHVyZV92ZWN0b3IgPC0gZmFjdG9yKHRlbXBlcmF0dXJlX3ZlY3Rvciwgb3JkZXIgPSBUUlVFLCBsZXZlbHMgPSBjKFwiTG93XCIsIFwiTWVkaXVtXCIsIFwiSGlnaFwiKSlcbmZhY3Rvcl90ZW1wZXJhdHVyZV92ZWN0b3IifQ==

重要概念: factor level

一般的因子变量有level, 我们为了表达清楚或者其它原因,而去修改level,使用levels()levels(factor_vector) <- c("name1", "name2",...)

我们这里有下面这样一个向量: survey_vector <- c("M", "F", "F", "M", "M") 我们首先把它转化成因子变量,然后修改它的level: M–> Male; F–> Female。 特别要注意level里面的顺序哟。

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIENvZGUgdG8gYnVpbGQgZmFjdG9yX3N1cnZleV92ZWN0b3JcbnN1cnZleV92ZWN0b3IgPC0gYyhcIk1cIiwgXCJGXCIsIFwiRlwiLCBcIk1cIiwgXCJNXCIpXG5mYWN0b3Jfc3VydmV5X3ZlY3RvciA8LSBmYWN0b3Ioc3VydmV5X3ZlY3RvcilcblxuIyBTcGVjaWZ5IHRoZSBsZXZlbHMgb2YgZmFjdG9yX3N1cnZleV92ZWN0b3JcbmxldmVscyhmYWN0b3Jfc3VydmV5X3ZlY3RvcikgPC1cblxuZmFjdG9yX3N1cnZleV92ZWN0b3IiLCJzb2x1dGlvbiI6IiMgQ29kZSB0byBidWlsZCBmYWN0b3Jfc3VydmV5X3ZlY3Rvclxuc3VydmV5X3ZlY3RvciA8LSBjKFwiTVwiLCBcIkZcIiwgXCJGXCIsIFwiTVwiLCBcIk1cIilcbmZhY3Rvcl9zdXJ2ZXlfdmVjdG9yIDwtIGZhY3RvcihzdXJ2ZXlfdmVjdG9yKVxuXG4jIFNwZWNpZnkgdGhlIGxldmVscyBvZiBmYWN0b3Jfc3VydmV5X3ZlY3RvclxubGV2ZWxzKGZhY3Rvcl9zdXJ2ZXlfdmVjdG9yKSA8LSBjKFwiRmVtYWxlXCIsIFwiTWFsZVwiKVxuXG5mYWN0b3Jfc3VydmV5X3ZlY3RvciJ9

我们经常使用summary()来快速查看因子变量。

下面我们就来看看不同因子变量的summary吧!

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIEJ1aWxkIGZhY3Rvcl9zdXJ2ZXlfdmVjdG9yIHdpdGggY2xlYW4gbGV2ZWxzXG5zdXJ2ZXlfdmVjdG9yIDwtIGMoXCJNXCIsIFwiRlwiLCBcIkZcIiwgXCJNXCIsIFwiTVwiKVxuZmFjdG9yX3N1cnZleV92ZWN0b3IgPC0gZmFjdG9yKHN1cnZleV92ZWN0b3IpXG5sZXZlbHMoZmFjdG9yX3N1cnZleV92ZWN0b3IpIDwtIGMoXCJGZW1hbGVcIiwgXCJNYWxlXCIpXG5mYWN0b3Jfc3VydmV5X3ZlY3RvclxuXG4jIEdlbmVyYXRlIHN1bW1hcnkgZm9yIHN1cnZleV92ZWN0b3JcblxuXG4jIEdlbmVyYXRlIHN1bW1hcnkgZm9yIGZhY3Rvcl9zdXJ2ZXlfdmVjdG9yIiwic29sdXRpb24iOiIjIEJ1aWxkIGZhY3Rvcl9zdXJ2ZXlfdmVjdG9yIHdpdGggY2xlYW4gbGV2ZWxzXG5zdXJ2ZXlfdmVjdG9yIDwtIGMoXCJNXCIsIFwiRlwiLCBcIkZcIiwgXCJNXCIsIFwiTVwiKVxuZmFjdG9yX3N1cnZleV92ZWN0b3IgPC0gZmFjdG9yKHN1cnZleV92ZWN0b3IpXG5sZXZlbHMoZmFjdG9yX3N1cnZleV92ZWN0b3IpIDwtIGMoXCJGZW1hbGVcIiwgXCJNYWxlXCIpXG5mYWN0b3Jfc3VydmV5X3ZlY3RvclxuXG4jIEdlbmVyYXRlIHN1bW1hcnkgZm9yIHN1cnZleV92ZWN0b3JcbnN1bW1hcnkoc3VydmV5X3ZlY3RvcilcblxuIyBHZW5lcmF0ZSBzdW1tYXJ5IGZvciBmYWN0b3Jfc3VydmV5X3ZlY3Rvclxuc3VtbWFyeShmYWN0b3Jfc3VydmV5X3ZlY3RvcikifQ==

因子向量可以比较大小吗? 我们来试一试: 直接点击run

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIEJ1aWxkIGZhY3Rvcl9zdXJ2ZXlfdmVjdG9yIHdpdGggY2xlYW4gbGV2ZWxzXG5zdXJ2ZXlfdmVjdG9yIDwtIGMoXCJNXCIsIFwiRlwiLCBcIkZcIiwgXCJNXCIsIFwiTVwiKVxuZmFjdG9yX3N1cnZleV92ZWN0b3IgPC0gZmFjdG9yKHN1cnZleV92ZWN0b3IpXG5sZXZlbHMoZmFjdG9yX3N1cnZleV92ZWN0b3IpIDwtIGMoXCJGZW1hbGVcIiwgXCJNYWxlXCIpXG5cbiMgTWFsZVxubWFsZSA8LSBmYWN0b3Jfc3VydmV5X3ZlY3RvclsxXVxuXG4jIEZlbWFsZVxuZmVtYWxlIDwtIGZhY3Rvcl9zdXJ2ZXlfdmVjdG9yWzJdXG5cbiMgQmF0dGxlIG9mIHRoZSBzZXhlczogTWFsZSAnbGFyZ2VyJyB0aGFuIGZlbWFsZT9cbm1hbGUgPiBmZW1hbGUifQ==

对,没有排序的因子变量不能比较大小,在R看来,他们是平等的。

在另外一些时候,我们需要因子变量的不同分类之间有顺序,有大小。 现在假设你有5匹赛马,他们的速度不同,你将他们分成三类“slow”, “medium” or “fast”,把结果存成speed_vector

  • horse 1 is medium,
  • horse 2 is slow,
  • horse 3 is slow,
  • horse 4 is medium
  • horse 5 is fast.

并把他们转化成有序的因子向量,格式是这样的:

factor(some_vector, ordered = TRUE, levels = c("lev1", "lev2" ...))

聪明的你,一看就会对不对?

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIENyZWF0ZSBzcGVlZF92ZWN0b3JcbnNwZWVkX3ZlY3RvciA8LSBjKFwibWVkaXVtXCIsIFwic2xvd1wiLCBcInNsb3dcIiwgXCJtZWRpdW1cIiwgXCJmYXN0XCIpXG5cbiMgQ29udmVydCBzcGVlZF92ZWN0b3IgdG8gb3JkZXJlZCBmYWN0b3IgdmVjdG9yXG5mYWN0b3Jfc3BlZWRfdmVjdG9yIDwtXG5cbiMgUHJpbnQgZmFjdG9yX3NwZWVkX3ZlY3RvclxuZmFjdG9yX3NwZWVkX3ZlY3Rvclxuc3VtbWFyeShmYWN0b3Jfc3BlZWRfdmVjdG9yKSIsInNvbHV0aW9uIjoiIyBDcmVhdGUgc3BlZWRfdmVjdG9yXG5zcGVlZF92ZWN0b3IgPC0gYyhcIm1lZGl1bVwiLCBcInNsb3dcIiwgXCJzbG93XCIsIFwibWVkaXVtXCIsIFwiZmFzdFwiKVxuXG4jIEFkZCB5b3VyIGNvZGUgYmVsb3dcbmZhY3Rvcl9zcGVlZF92ZWN0b3IgPC0gZmFjdG9yKHNwZWVkX3ZlY3Rvciwgb3JkZXJlZCA9IFRSVUUsIGxldmVscyA9IGMoXCJzbG93XCIsIFwibWVkaXVtXCIsIFwiZmFzdFwiKSlcblxuIyBQcmludCBmYWN0b3Jfc3BlZWRfdmVjdG9yXG5mYWN0b3Jfc3BlZWRfdmVjdG9yXG5zdW1tYXJ5KGZhY3Rvcl9zcGVlZF92ZWN0b3IpIn0=

有序因子变量,我们是不是就可以比较大小了呢?试一试!

[2]选取第二匹马,

[5]选取第五匹马,

比较他们的速度:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIENyZWF0ZSBmYWN0b3Jfc3BlZWRfdmVjdG9yXG5zcGVlZF92ZWN0b3IgPC0gYyhcIm1lZGl1bVwiLCBcInNsb3dcIiwgXCJzbG93XCIsIFwibWVkaXVtXCIsIFwiZmFzdFwiKVxuZmFjdG9yX3NwZWVkX3ZlY3RvciA8LSBmYWN0b3Ioc3BlZWRfdmVjdG9yLCBvcmRlcmVkID0gVFJVRSwgbGV2ZWxzID0gYyhcInNsb3dcIiwgXCJtZWRpdW1cIiwgXCJmYXN0XCIpKVxuXG4jIEZhY3RvciB2YWx1ZSBmb3Igc2Vjb25kIGhvcnNlXG5ob3JzZTIgPC1cblxuIyBGYWN0b3IgdmFsdWUgZm9yIGZpZnRoIGhvcnNlXG5ob3JzZTUgPC1cblxuIyBJcyBkYXRhIGhvcnNlIDIgZmFzdGVyIHRoYW4gZGF0YSBob3JzZSA1PyIsInNvbHV0aW9uIjoiIyBDcmVhdGUgZmFjdG9yX3NwZWVkX3ZlY3Rvclxuc3BlZWRfdmVjdG9yIDwtIGMoXCJtZWRpdW1cIiwgXCJzbG93XCIsIFwic2xvd1wiLCBcIm1lZGl1bVwiLCBcImZhc3RcIilcbmZhY3Rvcl9zcGVlZF92ZWN0b3IgPC0gZmFjdG9yKHNwZWVkX3ZlY3Rvciwgb3JkZXJlZCA9IFRSVUUsIGxldmVscyA9IGMoXCJzbG93XCIsIFwibWVkaXVtXCIsIFwiZmFzdFwiKSlcblxuIyBGYWN0b3IgdmFsdWUgZm9yIHNlY29uZCBob3JzZVxuaG9yc2UyIDwtIGZhY3Rvcl9zcGVlZF92ZWN0b3JbMl1cblxuIyBGYWN0b3IgdmFsdWUgZm9yIGZpZnRoIGhvcnNlXG5ob3JzZTUgPC1mYWN0b3Jfc3BlZWRfdmVjdG9yWzVdXG5cbiMgSXMgaG9yc2UgMiBmYXN0ZXIgdGhhbiBob3JzZSA1P1xuICBcbmhvcnNlMiA+IGhvcnNlNSJ9

数值型变量可以用levels和labels参数来编码成因子。如果男性被编码成1,女性被编码成2,则以下语句:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJzZXg8LWMoMSwyLDIsMSwyLDEsMSwzKSBcbnNleFxuXG5zZXggPC0gZmFjdG9yKHNleCwgbGV2ZWxzPWMoMSwgMiksIGxhYmVscz1jKFwiTWFsZVwiLCBcIkZlbWFsZVwiKSlcbnNleCJ9

在这个栗子里,性别被当成类别型变量,标签“Male”和“Female”替代了1和2在结果中输出,而且所有不是1或2的性别变量将被设为缺失值。

完结撒花~