让我们先创造一些因素:
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; - 的使用纯粹是水平的重新标记,但它也没有按照我的预期重新排序。
有人可以解释一下这个区别吗?
答案 0 :(得分:9)
F1
使用数字排序,因为你自己想出来了。
F2
使用词典排序,首先比较第一个字符,使用第二个字符断开关系,依此类推,这就是"10 years"
介于"1 years"
和"2 years"
之间的原因。
F4
是从字符向量创建的,但带有明确的可能因子列表。因此,列表被采用(没有排序)并用数字1到6标识。然后将输入的每个项目与可能的级别集合进行比较,并存储相关的数字。毕竟,一个因素只是一堆数字(as.numeric
将向您显示)与用于打印的级别列表相关联。因此,F4
的打印方式与F2
类似,但其级别的排序方式不同。
F3
是从F2创建的,因此其级别最初未分类。赋值仅替换级别名称集合,而不是向量中的数字。因此,您可以将其视为重命名现有级别。如果您查看这些数字,它们将与F2
中的数字相匹配,而相关的名称,特别是名称的顺序则与F4
的数字相匹配。
正如您的问题声称这不是纯粹的重新标记:是的,它是纯粹的重新标记,您使用以下更改从F3
获取F2
(在打印输出的两行中):< / p>
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
这是各个数据点的数据(或映射到原始级别)的不同基础数字表示,导致您在F3
和F4
之间看到差异。
之前我被此咬过,现在知道要注意它,但它不时会让我感到厌烦。