如何使用fct_reorder重新排序数据框中的因子?

时间:2018-02-15 02:08:28

标签: r forcats

考虑以下示例

> 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执行此操作的语法是什么,它背后的逻辑是什么?

谢谢!

2 个答案:

答案 0 :(得分: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的{​​{1}}的{​​{1}}将按默认计算并按升序排序,以便对因子进行排序。

答案 1 :(得分:0)

为了了解fct_reoder,我创建了一个类似但经过修改的数据框。

select count(distinct customer_fname) as uniquenamecount
from customers;

在这里我们可以看到有2列,其中第1列(var)作为因子变量,级别为c(1,2,3,4)。

现在,如果要基于各个值之和(var2)对因子进行重新排序,则可以使用fct_reorder函数,如下所示。

为了在有和没有fct_reorder的情况下获得差值b / w。

首先,我们将根据其因子(var)对var2进行汇总,而无需使用fct_reorder:

> 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 ...

在这里我们可以看到结果不是基于var2的和排序的。

现在,我们将使用fct_order来显示差异。

> 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

这表明求和现在已排序。

同样,fct_reorder可用于以有序方式绘制图形(箱形图或直方图等)