【问题标题】:How to prevent integer reordering when converting to factor?转换为因子时如何防止整数重新排序?
【发布时间】:2017-07-20 10:45:43
【问题描述】:

这实际上更多是关于R中这种行为的为什么如何的问题。

我有一个向量

c("18", "68", "18-20", "22", "27", "16-18", "unkown")

我希望如果我跑了

as.factor(c("18", "68", "18-20", "22", "27", "16-18", "unkown"))

级别将遵循向量元素的顺序。相反,它们的排序就像 R 试图解释每个元素中的数字字符一样:

[1] 18     68     18-20  22     27     16-18  unkown
Levels: 16-18 18 18-20 22 27 68 unkown

如果元素是类字符,但实际上是整数/数字,我可以看到这应该如何发生。但由于18-20 等更多模棱两可的格式,我不确定 R 是如何知道订购它们的。 事实上,如果我必须分两步转换为因数(先转换为整数,然后再转换为因数):

> as.integer(c("18", "68", "18-20", "22", "27", "16-18", "unkown"))
[1] 18 68 NA 22 27 NA NA
Warning message:
NAs introduced by coercion 

这很有意义,因为18-20 是一个简单的字符串。

【问题讨论】:

  • 为什么你首先会遇到这个问题?排序后显示关卡更有意义。
  • ?factor 中解释了大部分这种行为。

标签: r


【解决方案1】:

如果没有提供任何级别,文档说明:

levels:x 的值(作为字符串)的可选向量 可能已经采取了。默认值是唯一的一组值 as.character(x),按 x 的升序排序。注意这个集合 可以指定为小于 sort(unique(x))。

所以它与数值无关,它们像字符串一样被排序。确实:

> sort(unique(as.character(c("18", "68", "18-20", "22", "27", "16-18", "unkown"))))
[1] "16-18"  "18"     "18-20"  "22"     "27"     "68"     "unkown"

您可以按如下方式阻止排序:

> x=c("18", "68", "18-20", "22", "27", "16-18", "unkown")
> factor(x,levels=unique(x))

[1] 18     68     18-20  22     27     16-18  unkown
Levels: 18 68 18-20 22 27 16-18 unkown

【讨论】:

    猜你喜欢
    • 2016-12-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 2013-07-08
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多