Как отсортировать часть фрейма данных по нескольким столбцам в R? - PullRequest
1 голос
/ 06 апреля 2020

Сортировка обсуждалась здесь довольно часто, но у меня есть особая проблема. У меня есть фрейм данных (DF) с несколькими столбцами. Все наблюдения принадлежат к одному из трех типов, скажем, C1, C2 и C3. Один из различных столбцов содержит значение, которое я назову частотой (f). Пример df:

  Type  freq  Val 
   C3.   0.34.  10-A
   C1.   0.90.  4-A
   C2.   0.40.  5-B
   C1.   0.65.  3-C
   C2.   0.77.  5-D
   C3.   0.11.  5-D

Мне нужно отсортировать эту таблицу так, чтобы первичный ключ был типом, а вторичный ключ - частотой. Тем не менее, и вот моя проблема, они должны быть отсортированы по определенному порядку типа. Они нужны мне по C1, C3, C2. Итак, финальный стол выглядит так:

   Type  freq  Val
   C1.   0.90.  4-A
   C1.   0.65.  3-C
   C3.   0.34.  10-A
   C3.   0.11.  5-D
   C2.   0.77.  5-D
   C2.   0.40.  5-B

Есть ли способ сделать это? Чтобы выбрать конкретную схему заказа столбца Тип. Любое предложение высоко ценится. Спасибо

1 Ответ

1 голос
/ 06 апреля 2020

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

library(dplyr)
df1 %>% 
   arrange(factor(Type, levels = c('C1.', 'C3.', 'C2.')), desc(freq))
#  Type  freq  Val
#1  C1. 0.90.  4-A
#2  C1. 0.65.  3-C
#3  C3. 0.34. 10-A
#4  C3. 0.11.  5-D
#5  C2. 0.77.  5-D
#6  C2. 0.40.  5-B

Или используя data.table

library(data.table)
setDT(df1)[, Type := factor(Type,  levels = c('C1.', 'C3.', 'C2.'))]
setorder(df1, Type, -freq)

В base R мы можем сделать

df1[order(factor(df1$Type, levels = c('C1.', 'C3.', 'C2.')), -df1$freq),]

data

df1 <- structure(list(Type = c("C3.", "C1.", "C2.", "C1.", "C2.", "C3."
), freq = c("0.34.", "0.90.", "0.40.", "0.65.", "0.77.", "0.11."
), Val = c("10-A", "4-A", "5-B", "3-C", "5-D", "5-D")), 
  class = "data.frame", row.names = c(NA, 
-6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...