используйте столбец фрейма данных для изменения уровней фактора

#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)))