【问题标题】:Setting levels when creating a factor vs. `levels()<-`创建因子时设置水平和。 `水平()<-`
【发布时间】:2012-07-20 04:31:14
【问题描述】:

让我们先创建一些因子:

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

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

让我更难理解的是 F3 和 F4 之间设置级别的区别。在 F3 中,我在创建因子后设置级别,而在 F4 中,我在创建因子时明确设置它们。在 F3 中,levels()

有人能解释一下区别吗?

【问题讨论】:

    标签: r factors


    【解决方案1】:

    F1 使用数字排序,正如您自己发现的那样。

    F2 使用字典排序,首先比较第一个字符,然后使用第二个字符打破平局,依此类推,这就是为什么 "10 years" 介于 "1 years" 和 "2 years" 之间。

    F4 是从字符向量创建的,但有一个明确的可能因素列表。因此,该列表被提取(不排序)并用数字 1 到 6 标识。然后将输入的每个项目与一组可能的级别进行比较,并存储相关的数字。毕竟,一个因素只是一堆数字(as.numeric 将向您显示它们)与用于打印的级别列表相关联。所以F4 会像F2 一样打印出来,但是它的级别排序不同。

    F3 是从 F2 创建的,因此它的级别最初是未排序的。该分配仅替换了一组级别名称,而不是向量中的数字。因此,您可以将其视为重命名现有关卡。如果您查看这些数字,它们将与来自 F2 的数字相匹配,而相关的名称,尤其是名称的顺序,与来自 F4 的数字相匹配。

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

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

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

    【讨论】:

      【解决方案2】:

      您根据以下数据创建了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&lt;- 所做的是更改数字表示和显示的标签之间的映射。这肯定不是不是一种重新排列或重新调整您所期望的因素的方法。 levels&lt;- 也不会重新排序数据,它只是改变因子的水平;底层的数字表示仍然有效,因此映射到新的级别。

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

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

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

      我以前被这个咬过,现在知道要注意它,但它确实会时不时地把我赶出去。

      【讨论】:

        猜你喜欢
        • 2018-12-07
        • 2017-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-06
        相关资源
        最近更新 更多