[英]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.