Изменение порядка строк с использованием пользовательского порядка
Предоставленные данные:
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
С помощью dplyr
Как переставить строки, чтобы получить конкретный порядок c("C", "A", "B")
в category
?
# category b
# 1: C 3
# 2: A 1
# 3: B 2
2 ответа
Решение
Сначала создайте вектор с буквами в нужном порядке. затем match
* вектор с переменной для сортировки. match
возвращает индексы (первых) совпадений, которые можно подключить к 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
Другим способом было бы преобразовать "категорию" в factor
, задавать levels
в желаемом порядке, и использовать arrange
:
DT %>%
mutate(category = factor(category, levels = x)) %>%
arrange(category)
# category b
# 1 C 3
# 2 A 1
# 3 B 2
* The match
метод вдохновлен этим ответом.
Альтернативой может быть следующее: обратите внимание, что аранжировка может принимать список новых индексов.
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))