我想重新排序一个因子的级别,以便新的顺序按字母顺序显示所有值,除了一个(其他),我希望它是最后一个。
让我们假设我们有这个因素:
x <- factor(c("Yes", "No", "Other", "Yes", "No", "Other"))
> x
[1] Yes No Other Yes No Other
Levels: No Other Yes
我希望他们的关卡按此顺序显示:“是”,“否”,“其他”,而不是默认值。我知道在这个愚蠢的例子中我可以通过以下方式轻松实现:
x2 <- factor(c("Yes", "No", "Other", "Yes", "No", "Other"),
levels = c("Yes", "No", "Other"))
这会产生我想要的东西:
> x2
[1] Yes No Other Yes No Other
Levels: Yes No Other
但是,如果我们有一个具有多个不同级别的向量并且我们不想再次写入它们,那么它就不会那么有趣了,除了一个它们之后它们的订单都很好!
有没有更好的方法来解决这个问题,而无需从头开始编写整个矢量?
答案 0 :(得分:5)
您将必须明确指定所需的新levels=
,但除了键入它们之外,还有更简单的方法来移动它们。例如
x <- factor(c("Yes", "No", "Other", "Yes", "No", "Other"))
old.lvl<-levels(x)
x<-factor(x, levels=c(sort(old.lvl[old.lvl!="Other"], decreasing=T), "Other"))
x
# [1] Yes No Other Yes No Other
# Levels: Yes No Other
当然这是一个有点愚蠢的例子,但是因素水平没有“移动一个”选项。您可以利用R丰富的索引操作来随意移动它们。
答案 1 :(得分:1)
现在,您可以使用forcats::fct_relevel
用你的例子:
> x <- factor(c("Yes", "No", "Other", "Yes", "No", "Other"))
> x
[1] Yes No Other Yes No Other
Levels: No Other Yes
# set "Yes" as first level and keep the rest alphabetically ordered
> x2 <- fct_relevel(x, "Yes")
> x2
[1] Yes No Other Yes No Other
Levels: Yes No Other