web-dev-qa-db-fra.com

Réorganiser les lignes à l'aide d'une commande personnalisée

Données données:

library(data.table)
DT = data.table(category=LETTERS[1:3], b=1:3)
DT
#    category b
# 1:        A 1
# 2:        B 2
# 3:        C 3

En utilisant dplyr, comment réorganiser les lignes pour obtenir un ordre spécifique c("C", "A", "B") dans category?

#    category b
# 1:        C 3
# 2:        A 1
# 3:        B 2
39
Daniel Krizian

Créez d'abord un vecteur avec les lettres dans l'ordre souhaité. Puis match * le vecteur avec la variable à trier. match renvoie les indices des (premières) correspondances, qui peuvent être connectés à slice:

library(dplyr)

# create a vector with letters in the desired order
x <- c("C", "A", "B")

DT %>%
  slice(match(x, category))
#   category b
# 1        C 3
# 2        A 1
# 3        B 2

Une autre façon serait de convertir "catégorie" en factor, de définir levels dans l'ordre souhaité et d'utiliser arrange:

DT %>%
  mutate(category =  factor(category, levels = x)) %>%
  arrange(category)    
#   category b
# 1        C 3
# 2        A 1
# 3        B 2

* La méthode match est inspirée de cette réponse .

66
Henrik