【问题标题】:how to reorder a factor in a dataframe with fct_reorder?如何使用 fct_reorder 对数据框中的因子重新排序?
【发布时间】:2018-02-15 02:08:27
【问题描述】:

考虑以下示例

> 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 的语法是什么,背后的逻辑是什么?

谢谢!

【问题讨论】:

  • 只需按您想要的顺序将因子变量输入factor() 并将ordered 参数设置为TRUE
  • 谢谢,你能用 fct_recode 写吗?

标签: r forcats


【解决方案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,其中 order 由某个 function fun 在某个 vector 上的输出给出 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

dataframe$var2 中的dataframe$var2 中的每个factor 将默认按升序计算和排序以对因子进行排序。

【讨论】:

  • 谢谢,但你能用我提供的例子吗?
  • 我不明白的是 x 是否必须与因子在同一个数据帧中
  • 没有。 x 可以是任何向量(与 f 的长度相同),它将按 f 分组以应用 fun。 fct_reorder 的全部意义在于您不必对 rank_var 进行显式计算。
  • 谢谢,如果我提出明显的问题,我很抱歉。还有一些我没有得到的东西。您是说在幕后fun 将应用于相同因子水平的行中? (本质上是在做group_by(myfactor) 计算?
  • 我也猜想x 的每个元素,比如x_i 都与f 的元素在同一行相关联?
【解决方案2】:

为了理解 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 的黑白差异。

首先,我们会在不使用 fct_reorder 的情况下,根据它们的因子(var)对 var2 进行总结:

> 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 可用于按顺序绘制图形(箱线图或直方图等)

【讨论】:

  • 在 RStudio 的 fct_reorder2() 帮助中,我复制了这个例子(请复制到 WORD 中阅读): df
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
相关资源
最近更新 更多