转换为因子时如何防止整数重新排序?

时间:2017-07-20 10:45:43

标签: r

这实际上是关于为什么如何在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是一个简单的字符串。

1 个答案:

答案 0 :(得分:1)

如果未提供任何级别,则文档说明:

  

级别: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