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

5
请看下面的例子。
> 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 - tushaR
谢谢,您能用fct_recode写一下吗? - ℕʘʘḆḽḘ
2个回答

6
假设你的 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)由某个特定的函数(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

默认情况下,将计算每个factordataframe$var2的平均值,并按升序排列以排序因子。


我不太明白的是,x是否必须与因子(factor)在同一个数据框(dataframe)中。 - ℕʘʘḆḽḘ
不。x 可以是任何向量(与 f 长度相同),它将被 f 分组以应用 funfct_reorder 的整个重点在于您不必对 rank_var 进行显式计算。 - tushaR
谢谢,如果我问了一些显而易见的问题,很抱歉。还有一些我不太明白的地方。你是说在底层,fun将在相同因子水平的行内应用?(本质上进行group_by(myfactor)计算? - ℕʘʘḆḽḘ
我猜每个x的元素,比如说x_i,都与f的同一行上的元素相关联? - ℕʘʘḆḽḘ
@ℕʘʘḆḽḘ 是的。看到你有四个因子级别。所以为了对它们进行排序,你需要计算由函数fun(x)得出的四个等级。x将是一个变量值的向量,该变量被指定为x(在这种情况下是dataframe$var2),对应于每个因子。我使用不同的一组值的原因是让你看到不同函数(如summaxmin)对因子顺序的影响。 - tushaR

1
为了理解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 ...

在这里,我们可以看到有两列,第一列(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 <- tibble::tribble( ~color, ~a, ~b, "blue", 1, 2, "green", 6, 2, "purple", 3, 3, "red", 2, 3, "yellow", 5, 1 ) df$color <- factor(df$color)

Levels: blue green purple red yellow

fct_reorder(df$color, df$a, min)

Levels: blue red purple yellow green

fct_reorder2(df$color, df$a, df$b)

Levels: purple red blue green yellow

最后一个很难理解。你能帮我理解吗?
- Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接