Сортировать данные столбца в соответствии с предварительно определенным порядком, используя R - PullRequest
1 голос
/ 15 марта 2020

У меня есть вектор:

cat_order <- c('apple', 'banana', 'orange')

и мой dataframe:

fruitDF

fruits    price
apple     2.2
orange    1.7
banana    1.5
banana    1.2
orange    3.2
apple     2.1
orange    1.1
banana    4.1

Что я хочу?

fruits    price
apple     2.2
banana    1.5
orange    1.7
banana    1.2
orange    3.2
apple     2.1
banana    4.1
orange    1.1

Что я сделал?

Я мог бы заказать по цене

fruitDF[order(price),]

, но это потому, что это quantitative, но я хочу отсортировать fruitDF согласно категориальному cat_order, как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 15 марта 2020

Мы можем преобразовать столбец 'fruits' в factor с levels, указанным в order

fruitDF[order(factor(fruitDF$fruits, levels = cat_order)),]
#    fruits price
#2  apple   2.2
#1 banana   1.5
#3 orange   1.7

. Или другой вариант: match

fruitDF[match(fruitDF$fruits, cat_order),]

*. 1011 * Или с data.table
library(data.table)
setDT(fruitDF)[order(match(fruits, order))]

data

fruitDF <- structure(list(fruits = c("banana", "apple", "orange"), price = c(1.5, 
2.2, 1.7)), class = "data.frame", row.names = c(NA, -3L))
1 голос
/ 15 марта 2020

Если вы хотите использовать решение tidyverse, вы можете сделать следующее (фрейм данных из @akrun):

library(dplyr)

fruitDF %>%
  arrange(match(fruits, cat_order))

Или:

fruitDF %>%
  arrange(factor(fruits, levels = cat_order))
...