首页 > 解决方案 > `R`中`reorder()`背后的逻辑?

问题描述

我很难理解背后的逻辑reorder()

假设Var定义如下:

Var <- factor(c(0.2, 0.1, -0.1))
order(Var)

现在,如果我想将其重新排序为 c(1, 2, 3),我将运行以下代码,它工作得非常好。

Needed_Order <- c(1, 2, 3)
Var <- reorder(Var, Needed_Order)
order(Var)

Var但是如果我想重新排序到 c(3, 1, 2)它不起作用

Needed_Order <- c(3,1,2)
Var <- reorder(Var, Needed_Order)
order(Var)

我希望得到3 1 2的输出,order(var)但它返回2 3 1

标签: r

解决方案


我认为@prosoitos 已经有了一个很好的答案。我只是想说明该reorder功能存在的原因以及它的用途。

在图中对组进行排序

让我们考虑经典iris数据集

> data(iris)
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

并假设我们要绘制Sepal.Width值,比较Species

boxplot(Sepal.Width ~ Species, iris)

在此处输入图像描述

但这里的顺序是按物种名称排序的,而我们认为如果我们按每个物种的平均萼片宽度排序,该图会更好看。这reorder就是一个快速、强大的解决方案:

iris$Species <- reorder(iris$Species, iris$Sepal.Width, FUN=mean)
boxplot(Sepal.Width ~ Species, iris)

在此处输入图像描述

这里发生的情况是,iris$Sepal.Width对应于每个级别的值iris$Species都应用了函数mean,并将结果作为scores属性附加到因子:

> attr(iris$Species, 'scores')
    setosa versicolor  virginica
     3.428      2.770      2.974

然后使用这些分数对因子中的水平进行排名(按升序排列),并按顺序分配它们:

> levels(iris$Species)
[1] "versicolor" "virginica"  "setosa"

请注意,这不会更改数据框中任何数据的顺序,而只会更改因子中使用的代码的顺序。FUN参数使该reorder函数非常通用,因此可以按 min 或 max 或您想在分组数据上计算的任何函数排序。

总的来说,我认为关键是reorder函数中的第二个参数,这被认为是所需的顺序,而是用于输入与因子中每个条目相关联的权重或值。


推荐阅读