我試圖通過排序重新排序因子的級別,同時保持因子分組。然而,這并不像僅僅對級別或標簽進行排序那么簡單。這是一個示例資料框:
dat <- data.frame(trt = c('0_m', '0.2_m', '0.4_m', '0.6_m'), letter = factor(c("b", "c", "a", "b")), value = c(2, 3, 1, 2.1))
dat
# trt letter value
# 1 0_m b 2.0
# 2 0.2_m c 3.0
# 3 0.4_m a 1.0
# 4 0.6_m b 2.1
字母列的級別已經按字母順序排序,但您會注意到它們是按數字value列的順序分配的。
levels(dat$letter)
# [1] "a" "b" "c"
這里的資料框按trt列排序。最終目標是在letter您向下行時按字母順序對列進行排序,同時保留具有相同標簽的任何級別。例如,我想要實作的是以下輸出:
dat
# trt letter value
# 1 0_m a 2.0
# 2 0.2_m b 3.0
# 3 0.4_m c 1.0
# 4 0.6_m a 2.1
復雜的是,這是在一個函式中,該函式將顯示一組任意的字母/因子標簽,按字母順序排序,所以我不能只是手動對它們進行排序。我覺得通過factor(), 和levels和labels引數的某種組合,這應該是相對直接的,但我不太明白。另外,如果可能的話,我更喜歡基本的 R 解決方案,以避免添加額外的依賴項。
uj5u.com熱心網友回復:
以下應該完成您正在尋找的內容。您應該能夠使用方括號表示法(例如[,2])或其他健壯的東西來指定列號,以防您不想指定letter.
dat <- data.frame(
trt = c('0_m', '0.2_m', '0.4_m', '0.6_m'),
letter = factor(c("b", "c", "a", "b")),
value = c(2, 3, 1, 2.1))
dat
# trt letter value
# 1 0_m b 2.0
# 2 0.2_m c 3.0
# 3 0.4_m a 1.0
# 4 0.6_m b 2.1
levels(dat$letter) <- sort(unique(dat$letter))[order(unique(dat$letter))]
dat
trt letter value
# 1 0_m a 2.0
# 2 0.2_m b 3.0
# 3 0.4_m c 1.0
# 4 0.6_m a 2.1
此外,letter在重置級別之前快取列的唯一值可能很有用,而不是兩次計算唯一值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336881.html
標籤:r
