R:按字母顺序重新排序因子的级别,但是一个

cca*_*ara 1 r

我想重新排序一个因子的级别,以便新的顺序按字母顺序显示所有值,除了一个(其他),我希望它是最后一个.

让我们假设我们有这个因素:

x <- factor(c("Yes", "No", "Other", "Yes", "No", "Other"))

> x
[1] Yes   No    Other Yes   No    Other
Levels: No Other Yes
Run Code Online (Sandbox Code Playgroud)

我希望他们的关卡按此顺序显示:"是","否","其他",而不是默认值.我知道在这个愚蠢的例子中我可以通过以下方式轻松实现:

x2 <- factor(c("Yes", "No", "Other", "Yes", "No", "Other"), 
             levels = c("Yes", "No", "Other"))
Run Code Online (Sandbox Code Playgroud)

这将导致我想要的:

> x2
[1] Yes   No    Other Yes   No    Other
Levels: Yes No Other
Run Code Online (Sandbox Code Playgroud)

但是,如果我们有一个具有几个不同级别的向量并且我们不想再次编写它们就不会那么有趣了,因为除了一个之外他们的订单都很好!

有没有更好的方法来解决这个问题,而无需从头开始编写整个向量?

小智 6

你现在可以很容易地做到这一点 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
Run Code Online (Sandbox Code Playgroud)


MrF*_*ick 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
Run Code Online (Sandbox Code Playgroud)

当然这是一个有点愚蠢的例子,但是因素水平并没有"移动一个"选项.您可以利用R丰富的索引操作来随意移动它们.