在R data.frame中重新排序因子的级别

在R data.frame中重新排序因子的级别,r,sorting,levels,R,Sorting,Levels,这是我面临的一个简单的例子。我有我的因子水平B-1、B-2、B-9、B-10、B-11,并希望按上述给定顺序排列它们。在这里,我可以轻松地重新排列级别,但是,在我的数据中,我确实有复杂的结构,并且希望通过一些编码来完成。我想知道如何按逻辑顺序排列这些因素级别 set.seed(12345) f <- rep(c("B-1", "B-2", "B-9", "B-10", "B-11"), each=3) Y <- runif(n=15, min=100, max=1000) df &l

这是我面临的一个简单的例子。我有我的因子水平
B-1、B-2、B-9、B-10、B-11
,并希望按上述给定顺序排列它们。在这里,我可以轻松地重新排列级别,但是,在我的数据中,我确实有复杂的结构,并且希望通过一些编码来完成。我想知道如何按逻辑顺序排列这些因素级别

set.seed(12345)
f <- rep(c("B-1", "B-2", "B-9", "B-10", "B-11"), each=3)
Y <- runif(n=15, min=100, max=1000)
df <- data.frame(f, Y)


levels(df$f)
[1] "B-1"  "B-10" "B-11" "B-2"  "B-9"

library(gtools)
mixedsort(df$f)

[1] B-1  B-1  B-1  B-10 B-10 B-10 B-11 B-11 B-11 B-2  B-2  B-2  B-9  B-9  B-9 

Levels: B-1 B-10 B-11 B-2 B-9

df2 <- df[mixedorder(df$f), ]


df3 <- within(df, 
         Position <- factor(f, 
                          levels=names(sort(table(f), 
                                            decreasing=TRUE))))

levels(df3$Position)
[1] "B-1"  "B-10" "B-11" "B-2"  "B-9" 
set.seed(12345)

f我们可以将
级别
指定为“f”列的
混合排序
ed
级别

 df$f <- factor(df$f, levels=mixedsort(levels(df$f), decreasing=TRUE))
 levels(df$f)
 #[1] "B-1"  "B-2"  "B-9"  "B-10" "B-11"

df$f另一种解决方案是使用本机的
stats::relevel
函数,尽管我觉得更糟。但是,这只允许您提供一个新的引用级别(请参见源代码的最后一行
stats:::relevel.factor
),因此您需要递归调用它

rev_levels <- gtools::mixedsort(levels(df$f))

for (i in 1:length(rev_levels)) {
  df$f <- relevel(df$f, ref= rev_levels[i])
}

levels(df$f)
[1] "B-1"  "B-2"  "B-9"  "B-10" "B-11"

rev_levels这对我来说很有效,但我很困惑为什么
discreating=TRUE
必须按递增顺序(至少对我来说)排序(从B-1到B-11)?或者
df我认为连字符被视为负号,将所有数字设为负的
mixedsort
@BenBolker我认为
-
会产生一些问题。据我所知,如果我们使用
B1
B2
等,订单将是正确的。现在我可以得到解决方案,该解决方案在我发布后立即关闭。再次感谢@akrun的帮助。这是您使用gtools软件包的唯一原因吗<代码>级别(df$f)
rev_levels <- gtools::mixedsort(levels(df$f))

for (i in 1:length(rev_levels)) {
  df$f <- relevel(df$f, ref= rev_levels[i])
}

levels(df$f)
[1] "B-1"  "B-2"  "B-9"  "B-10" "B-11"