Как изменить порядок в кадре данных с fct_reorder?

Рассмотрим следующий пример

> library(forcats)
> library(dplyr)
> 
> 
> dataframe <- data_frame(var = c(1,1,1,2,3,4),
+                         var2 = c(10,9,8,7,6,5))
> dataframe
# A tibble: 6 x 2
    var  var2
  <dbl> <dbl>
1  1.00 10.0 
2  1.00  9.00
3  1.00  8.00
4  2.00  7.00
5  3.00  6.00
6  4.00  5.00

Я создаю факторную переменную

> dataframe <- dataframe %>% mutate(myfactor = factor(var))
> 
> dataframe$myfactor
[1] 1 1 1 2 3 4
Levels: 1 2 3 4

Я не понимаю, каков правильный синтаксис (и логика) для переупорядочения этого фактора в соответствии с некоторыми другими вычислениями, выполненными на уровне фактора.

Например, я хотел бы изменить свои факторы в соответствии с уменьшением значений

> data_rank <- dataframe %>% group_by(myfactor) %>% summarise(rank_var = mean(var2))

> data_rank
# A tibble: 4 x 2
  myfactor rank_var
  <fct>       <dbl>
1 1            9.00
2 2            7.00
3 3            6.00
4 4            5.00

Таким образом, 4 будет первым, 3 будет вторым и т. Д.

Каков синтаксис, чтобы сделать это с fct_reorderи какая логика стоит за этим?

Спасибо!

1 ответ

Решение

Предположим, ваш dataframe является:

dataframe <- data_frame(var = c(1,1,1,2,3,4),var2 = c(10,2,0,15,6,5))
dataframe <- dataframe %>% mutate(myfactor = factor(var))
dataframe$myfactor

[1] 1 1 1 2 3 4
Levels: 1 2 3 4

Теперь, если вы хотите изменить порядок factorгде порядок задается выводом определенной функции fun на определенный вектор x тогда вы можете использовать fct_reorder следующим образом:

dataframe$myfactor= fct_reorder(f = dataframe$myfactor,x = dataframe$var2,fun = mean)
dataframe$myfactor
[1] 1 1 1 2 3 4
Levels: 1 4 3 2

mean из dataframe$var2 для каждого factor будет рассчитан и отсортирован в порядке возрастания по умолчанию, чтобы упорядочить коэффициент.

Чтобы понять fct_reoder, я создал похожий, но модифицированный фрейм данных.

> dataframe <- data_frame(var = as.factor(c(1,2,3,2,3,1,4,1,2,3,4)),var2 = c(1,5,4,2,6,2,9,8,7,6,3))

> str(dataframe)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   11 obs. of  2 variables:
 $ var : Factor w/ 4 levels "1","2","3","4": 1 2 3 2 3 1 4 1 2 3 ...
 $ var2: num  1 5 4 2 6 2 9 8 7 6 ...

здесь мы можем видеть, что есть 2 столбца, имеющих столбец 1(var) в качестве факторной переменной с уровнями c(1,2,3,4).

Теперь, если кто-то хочет переупорядочить факторы на основе суммы их соответствующих значений (var2), можно использовать функцию fct_reorder, как показано ниже.

Чтобы получить разницу ч / б с и без fct_reorder.

Сначала мы бы суммировали var2 на основе их факторов (var) без использования fct_reorder:

> dataframe %>% group_by(var) %>% summarise(var2=sum(var2))
# A tibble: 4 x 2
  var    var2
  <fct> <dbl>
1 1        11
2 2        14
3 3        16
4 4        12

Здесь мы могли видеть, что результат не упорядочен на основе суммы var2.

Теперь мы будем использовать fct_order, чтобы показать разницу.

> dataframe %>% mutate(var=fct_reorder(var,var2,sum)) %>%
+ group_by(var) %>% summarise(var2=sum(var2))
# A tibble: 4 x 2
  var    var2
  <fct> <dbl>
1 1        11
2 4        12
3 2        14
4 3        16

Это показывает, что суммирование теперь упорядочено.

Аналогично, fct_reorder может использоваться для построения графиков (блокпост, гистограмма и т. Д.) Упорядоченным способом.

Другие вопросы по тегам