在创建因子时设置级别与`levels()< -`

时间:2012-07-20 21:23:03

标签: r factors

让我们先创造一些因素:

F1 <- factor(c(1,2,20,10,25,3))
F2 <- factor(paste0(F1, " years"))
F3 <- F2
levels(F3) <- paste0(sort(F1), " years")
F4 <- factor(paste0(F1, " years"), levels=paste0(sort(F1), " years"))

然后看看他们:

> F1
[1] 1  2  20 10 25 3 
Levels: 1 2 3 10 20 25

> F2
[1] 1 years  2 years  20 years 10 years 25 years 3 years 
Levels: 1 years 10 years 2 years 20 years 25 years 3 years

> F3
[1] 1 years  3 years  10 years 2 years  20 years 25 years
Levels: 1 years 2 years 3 years 10 years 20 years 25 years

> F4
[1] 1 years  2 years  20 years 10 years 25 years 3 years 
Levels: 1 years 2 years 3 years 10 years 20 years 25 years

首先我注意到&#34;预期&#34; F2中的等级顺序与F1不相似。查看factor文档可以了解原因:通过首先对输入进行排序来创建级别。在F2的情况下,这些是字符串,其中排序考虑了长度(?)。

我更难理解的是设置F3和F4之间的等级有所不同。在F3中,我在创建因子后设置了级别,而在F4中,我在创建因子时明确地设置它们。在F3中,level()&lt; - 的使用纯粹是水平的重新标记,但它也没有按照我的预期重新排序。

有人可以解释一下这个区别吗?

2 个答案:

答案 0 :(得分:9)

F1使用数字排序,因为你自己想出来了。

F2使用词典排序,首先比较第一个字符,使用第二个字符断开关系,依此类推,这就是"10 years"介于"1 years""2 years"之间的原因。

F4是从字符向量创建的,但带有明确的可能因子列表。因此,列表被采用(没有排序)并用数字1到6标识。然后将输入的每个项目与可能的级别集合进行比较,并存储相关的数字。毕竟,一个因素只是一堆数字(as.numeric将向您显示)与用于打印的级别列表相关联。因此,F4的打印方式与F2类似,但其级别的排序方式不同。

F3是从F2创建的,因此其级别最初未分类。赋值仅替换级别名称集合,而不是向量中的数字。因此,您可以将其视为重命名现有级别。如果您查看这些数字,它们将与F2中的数字相匹配,而相关的名称,特别是名称的顺序则与F4的数字相匹配。

正如您的问题声称这不是纯粹的重新标记:是的,它是纯粹的重新标记,您使用以下更改从F3获取F2(在打印输出的两行中):< / p>

  • 10→2
  • 2→3
  • 20→10
  • 25→20
  • 3→25

str函数也是查看因子内部表示的好工具。

答案 1 :(得分:6)

您从以下数据创建了F2

> paste0(F1, " years")
[1] "1 years"  "2 years"  "20 years" "10 years" "25 years"
[6] "3 years"

对唯一值进行排序以生成级别会导致您提及的字母数字排序

> levels(F2)
[1] "1 years"  "10 years" "2 years"  "20 years" "25 years"
[6] "3 years"

因此,"2 years"实际上存储为3 - 它位于第三类或关卡中。请注意,这会导致数据存储在因子中的方式存在细微差别:

> as.numeric(F1)
[1] 1 2 5 4 6 3
> as.numeric(F2)
[1] 1 3 4 2 5 6

当您明确设置F3的级别时,您传递的是以下值:

> paste0(sort(F1), " years")
[1] "1 years"  "2 years"  "3 years"  "10 years" "20 years"
[6] "25 years"

从上面,数据存储在F3中:

> as.numeric(F3)
[1] 1 3 4 2 5 6

因此F3的第二个元素获得您指定的第三个​​级别; "3 years"

因此levels<-更改了数字表示与显示的标签之间的映射。它肯定是重新排列或重新定位一个你想象的因素的方法。 levels<-也不对数据重新排序,它只是改变了因子的水平;基础数字表示仍然保留,因此映射到新级别。

F4中,您可以在创建时明确设置级别,因此数据以与F1相同的方式以数字方式存储:

> F4 <- factor(paste0(F1, " years"), levels=paste0(sort(F1), " years"))
> as.numeric(F4)
[1] 1 2 5 4 6 3

这是各个数据点的数据(或映射到原始级别)的不同基础数字表示,导致您在F3F4之间看到差异。

之前我被此咬过,现在知道要注意它,但它不时会让我感到厌烦。