#r #dplyr
#r #dplyr
Вопрос:
как я могу использовать столбец фрейма данных для изменения уровней фактора?
приведенный ниже пример является упрощением исходного набора данных, но показывает, чего я пытаюсь достичь.
Структура набора данных
df <- data.frame(X=c("DFV","TUG","WQD","PRF","NJK"),Y=c(2000,5000,3000,1000,4000))
Упорядочить порядок X на основе Y
ndf <- df %>% arrange(desc(Y))
Используйте ndf$X, чтобы изменить порядок df$X (исходный набор данных).
df <- df %>% mutate(X = factor(X,levels=ndf$X))
desired result
df
X Y
1 TUG 5000
2 NJK 4000
3 WQD 3000
4 DFV 2000
5 PRF 1000
Пожалуйста, обратите внимание, что проблема заключается не в том, чтобы расположить df в порядке убывания, а в том, как использовать столбец ndf X в параметре levels . Это проблема, которую я пытаюсь выяснить. Tks
Ответ №1:
Ваш подход правильный, но поскольку вы хотите упорядочить строки, используйте его в arrange
:
library(dplyr)
df %>% arrange(factor(X, levels = ndf$X))
# X Y
#1 TUG 5000
#2 NJK 4000
#3 WQD 3000
#4 DFV 2000
#5 PRF 1000
Вы также можете использовать match
:
df %>% arrange(match(X, ndf$X))
Комментарии:
1. Привет, ответ не решил мою проблему, но вы подтвердили, что я на правильном пути.
2. Почему именно это не решило вашу проблему? Это дает ожидаемый результат, который вы показали.
3. вы правы. Вывод правильный. Исходная проблема требовала немного больше, но я могу считать ваш ответ правильным на основе примера.
Ответ №2:
Есть две независимые задачи: i) установить уровни X
на основе Y
; ii) изменить порядок строк df
. В вашем вопросе говорится об изменении уровней, но ваш «желаемый результат», похоже, касается переупорядочения набора данных. Пожалуйста, уточните, нужен ли вам первый, второй или оба.
Изменение уровней, используя data.table
:
require(data.table)
setDT(df)
df[,X:=factor(X, levels=X[order(-Y)])]
(Обратите внимание, что это не сработает, если у вас есть какие-либо дублированные значения X
.)
Комментарии:
1. Привет, ваш комментарий о дублированных значениях X был полезен. Я не думал об этом.
Ответ №3:
В конце концов, необходимое решение было:
df %>% arrange(factor(X, levels = unique(ndf$X)))