Reordonați rândurile utilizând ordinea personalizată (Programare, R, Dplyr)

Daniel Krizian a intrebat.

Date date:

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

Folosind dplyr, cum se rearanjează rândurile pentru a obține o ordine specifică c("C", "A", "B") în category?

#    category b
# 1:        C 3
# 2:        A 1
# 3:        B 2

2 răspunsuri
Henrik

În primul rând, creați un vector cu literele în ordinea dorită. Apoi match* vectorul cu variabila care urmează să fie sortată. match returnează indicii (primelor) corespondențe, care pot fi introduse în 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

O altă modalitate ar fi să se convertească „category” în factor, set levels în ordinea dorită și să se utilizeze arrange:

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

*Cuvintele match este inspirată de metoda acest răspuns.

Comentarii

  • Așa cum se menționează în răspunsul inspirat, atenție la efectul de duplicat atunci când se utilizează match(). –  > Por farnsy.
Viktor Horváth

O alternativă ar putea fi următoarea, rețineți că arrange poate lua o listă de indici noi.

library(dplyr)

df <- data.frame(category = LETTERS[1:3], b = 1:3, stringsAsFactors = F)

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

df %>%
arrange(sapply(category, function(y) which(y == x))

Tags:,