簡體   English   中英

重新排序R data.frame中的因子級別

[英]Reordering levels of a factor in R data.frame

這是我所面對的一個簡單例子。 我有我的因子水平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" 

編輯

現在我可以找到這個問題的解決方案,當我發布它時立即關閉。 謝謝@akrun的幫助。

我們可以將levels指定為'f'列的mixedsort ed levels

 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"

或者根據@Ben Bolker的建議,變體就是

 df <- transform(df,f=factor(f,levels=mixedsort(levels(f), 
          decreasing=TRUE)))

而且我猜-在評論中提到的@Gregor被解釋為minus

另一種選擇,雖然IMO更糟糕,解決方案是使用本機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"

我主要發布這個解決方案,以顯示在我看來,基本R功能/解決方案中的缺陷。 該功能至少名稱不佳。 它並沒有真正的重新定位,它只是重新引用級別

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM