Факторинг одной переменной на основе двух других переменных в R - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь разложить переменную «category» по значению «high» в переменной «value» внутри «category» с набором данных, подобным следующему:

sample <- data.frame(
  category = c("cat1", "cat1", "cat1",
               "cat2", "cat2", "cat2", 
               "cat3", "cat3", "cat3"),
  subcat= c("high", "medium", "low", 
           "high", "medium", "low", 
           "high", "medium", "low"),
  value = c(15, 5, 4,
         7, 5, 3,
         19, 4, 3)
)

В конце я хотел бы, чтобы переменная "category" была разложена в следующем порядке:

cat3, cat1, cat2.

Факторинг должен быть упорядочен по значению 'high' ( переменной «subcat») внутри переменной «value».

Я уверен, что решение очень простое, но я не могу найти правильный код для него. Заранее большое спасибо!

РЕДАКТИРОВАТЬ: Конечно, я мог бы сделать это вручную, но я ищу какой-то автоматизированный код, поскольку я пытаюсь повторить это с большим набором данных. Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Используйте arrange(), чтобы упорядочить ваш фрейм данных, и levels(), чтобы изменить уровень. Итак, для вашего фрейма данных df вы можете сначала проверить порядок уровней факторов или, например, столбец "категория", с помощью levels(df$category). Вы также можете использовать это, чтобы изменить порядок уровней. Посмотрите следующий пример, который, вероятно, будет всем, что вам нужно для начала работы:

Кадр данных упорядочен по категориям, затем субкадр без переуровня:

library(dplyr)
df %>% arrange(category, subcat)

  category subcat value
1     cat1   high    15
2     cat1    low     4
3     cat1 medium     5
4     cat2   high     7
5     cat2    low     3
6     cat2 medium     5
7     cat3   high    19
8     cat3    low     3
9     cat3 medium     4

Повторное выравнивание, затем упорядочение:

levels(df$category) <- c('cat3', 'cat1', 'cat2')
df %>% arrange(category, subcat)

  category subcat value
1     cat3   high    15
2     cat3    low     4
3     cat3 medium     5
4     cat1   high     7
5     cat1    low     3
6     cat1 medium     5
7     cat2   high    19
8     cat2    low     3
9     cat2 medium     4

Вы можете изменить это по своему желанию подкатегории и ценности ... et c et c.

0 голосов
/ 27 марта 2020

Предполагая, что мы не знаем правильный порядок category заранее, и нам нужно выяснить, основываясь на value, возможно, вы можете использовать что-то вроде этого:

#Get indices of "high" values
inds <- sample$subcat == 'high'
#Get corresponding category values
category <- sample$category[finds]
#Get corresponding value and order it in descending order to get
#correct order of category value
order_category <- category[order(-sample$value[finds])]
#Order the dataframe based on order_category
sample[order(match(sample$category, order_category)), ]

#  category subcat value
#7     cat3   high    19
#8     cat3 medium     4
#9     cat3    low     3
#1     cat1   high    15
#2     cat1 medium     5
#3     cat1    low     4
#4     cat2   high     7
#5     cat2 medium     5
#6     cat2    low     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...