Как упорядочить фрейм данных по числовому вектору и вектору символов - PullRequest
1 голос
/ 11 ноября 2019

Я бы хотел упорядочить фрейм данных по числовому вектору и вектору символов, чтобы можно было удалить дубликаты в столбце «Код», сохранив записи с наибольшим значением в столбце «Значение». Однако, если в моем столбце «Категория» есть «YS» или «YS1», я хочу сохранить эти записи, даже если значение не является наибольшим числом
Вот пример набора данных:

Code <- c(2,2,3,5,3,7,8)
Value <- c(17,18,35,25,67,34,2)
Category <- c("YS", "DW", "YS1", "OS", "OS", "OS1", "GD")
Dataset <- data.frame(Code, Value, Category)

  Code Value Category
1    2    17       YS
2    2    18       DW
3    3    35      YS1
4    5    25       OS
5    3    67       OS
6    7    34      OS1
7    8     2       GD

Когда я упорядочиваю данные по коду (по возрастанию) и по значению (по убыванию) и удаляю повторяющиеся записи по коду, моя запись "YS" для кода = 2 не сохраняется, поскольку она имеет меньшее значение.

order_data <- Dataset[order(Dataset$Code, -Dataset$Value),]
dataset_nodup <- order_data[!duplicated(order_data$Code),]

  Code Value Category
2    2    18       DW
5    3    67       OS
4    5    25       OS
6    7    34      OS1
7    8     2       GD

Я бы хотел сначала упорядочить по моему столбцу Category, а затем по столбцу Value, чтобы мои записи "YS" и "YS1" были перечислены первыми. Я пробовал следующее, но это не работает.

order_data <- Dataset[order(Dataset$Code, -Dataset$Category, -Dataset$Value),]

Я бы хотел, чтобы мой вывод выглядел так:

  Code Value Category
1     2     17        YS
2     3     67       YS1
3     5     25        OS
4     7     34       OS1
5     8      2        GD

1 Ответ

1 голос
/ 11 ноября 2019

Мы можем использовать match, чтобы вывести Category с "YS" и "YS1" вперед и затем удалить дубликаты

order_data <- Dataset[with(Dataset, order(match(Category, c("YS", "YS1")),
                                    Code, -Value)),]
dataset_nodup <- order_data[!duplicated(order_data$Code),]

dataset_nodup
#  Code Value Category
#1    2    17       YS
#3    3    35      YS1
#4    5    25       OS
#6    7    34      OS1
#7    8     2       GD

Или используя dplyr

library(dplyr)

Dataset %>%
  arrange(match(Category, c("YS", "YS1")), Code, desc(Value)) %>%
  filter(!duplicated(Code))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...