R 更改多个特定因素的列表位置

R 更改多个特定因素的列表位置,r,R,关于如何重新排列列表,有很多信息,但我还没有找到这个特定问题的答案: 假设以下因素列表已排序: x <- factor(c(1, 4, 3, 7, 4, 8, 10, 34)) x Levels: 1 3 4 7 8 10 34 我知道,通过一个小列表,可以手动更改顺序,如下所示: factor(x, levels = c(10, 7, 1, 3, 4, 8, 34)) x Levels: 10 7 1 3 4 8 34 但在我的例子中,我正在处理大量的因素,在这些因素中,手动排序

关于如何重新排列列表,有很多信息,但我还没有找到这个特定问题的答案:

假设以下因素列表已排序:

x <- factor(c(1, 4, 3, 7, 4, 8, 10, 34))
x

Levels: 1 3 4 7 8 10 34
我知道,通过一个小列表,可以手动更改顺序,如下所示:

factor(x, levels = c(10, 7, 1, 3, 4, 8, 34))

x
Levels: 10 7 1 3 4 8 34
但在我的例子中,我正在处理大量的因素,在这些因素中,手动排序是不切实际的。而且,这个因素列表会发生变化,所以我想更动态地做这件事


因此,我正在寻找一种方法,可以移动指定因子的位置,同时保留列表中其他所有项的顺序,而不显式引用所有其他列表项。

一个选项是
relevel

relevel(x, "10")
#[1] 1  4  3  7  4  8  10 34
#Levels: 10 1 3 4 7 8 34

如果我们需要重新分级多个级别

forcats::fct_relevel(x, c(10, 7))
#[1] 1  4  3  7  4  8  10 34
#Levels: 10 7 1 3 4 8 34
位置也可以改变

forcats::fct_relevel(x, c(10, 7), after = 3)
#[1] 1  4  3  7  4  8  10 34
#Levels: 1 3 4 10 7 8 34
位置也可以在末尾

forcats::fct_relevel(x, c(10, 7), after = Inf)
#[1] 1  4  3  7  4  8  10 34
#Levels: 1 3 4 8 34 10 7

您可以使用
setdiff

x <- factor(c(1, 4, 3, 7, 4, 8, 10, 34))
L1 = levels(x)
ToMove = c("10","7")
L2 = c(ToMove, setdiff(L1, ToMove))
x <- factor(x, levels=L2)
levels(x)
[1] "10" "7"  "1"  "3"  "4"  "8"  "34"

x对不起,在我按下“提交”按钮后,我意识到我真的需要将多个因素推到最前面的能力(我已经知道这种将单个因素推到最前面的方法)
x <- factor(c(1, 4, 3, 7, 4, 8, 10, 34))
L1 = levels(x)
ToMove = c("10","7")
L2 = c(ToMove, setdiff(L1, ToMove))
x <- factor(x, levels=L2)
levels(x)
[1] "10" "7"  "1"  "3"  "4"  "8"  "34"