如何根据data.frame的顺序排序因子级别(而不是按字母顺序)

时间:2014-08-02 18:23:31

标签: r factors

根据this question,我订购了一个date.frame dd,其中有两个因素bx

dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"), levels = c("Low", "Med", "Hi"), ordered = TRUE),
             x = factor(c("A", "D", "A", "C")), 
             y = c(8, 3, 9, 9),
             z = c(1, 1, 1, 2))

dd <- dd[with(dd, order(b, x)), ]
   b x y z
 Low C 9 2
 Med D 3 1
  Hi A 8 1
  Hi A 9 1

dd$x级别的顺序并不反映dd $ x的实际顺序,而是按字母顺序排列。

levels(dd$x)
[1] "A" "C" "D"

我想要与data.frame中相同的级别顺序,即“C”,“D”,“A”

当然我可以do this

dd$x <- factor(dd$x, levels = c("C","D","A"))

但我需要一些普遍的东西。我试过了

dd$x <- factor(as.character(dd$x))

但是关卡的帮助状态:

  

default是as.character(x)采用的唯一值集,按x的递增顺序排序。

如何才能获得一个独特的价值,即“未分类”?

我试图理解功能因素,特别是参数水平因素,但这是出于我有限的理解。

我找到了solution,但我无法应用它:

dd <- within(dd, x <- reorder(x, b))

2 个答案:

答案 0 :(得分:7)

这应该是一般解决方案:

> factor(dd$x, as.character(unique(dd$x)))
[1] A D A C
Levels: A D C

但是,您的示例数据似乎与您描述的预期结果不符。

我想你可能也想要:

> factor(dd$x, rev(as.character(unique(dd$x))))
[1] A D A C
Levels: C D A

答案 1 :(得分:2)

试试这个:

levels(dd$x) <- rev(unique(rev(dd$x)))