r - `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
。
解决方案
我认为@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
函数中的第二个参数,这被认为是所需的顺序,而是用于输入与因子中每个条目相关联的权重或值。
推荐阅读
- java - 如何使用 Spring 实现自定义 WebSocket 子协议
- html - 当图像在 DIV 内浮动时删除文本换行
- google-apps-script - Google Apps 脚本模板化 HTML
- python-3.x - 如何使它着色OOP?
- python - 在 Pandas 中使用 groupedby 自定义数据框排序
- asp.net-core - 使用 Microsoft.DotNet.Web.Spa.ProjectTemplates::2.0.0 时,`dotnet run` 与 `npm start` 没有区别吗?
- python - 在熊猫中,如何从另一个列的一部分创建一个新列,遵守一个条件?
- json - 为什么 Elasticsearch Ingest 不接受 Logstash 的 grok 模式?
- vmware-clarity - Clarity Datagrid 自定义过滤器示例
- plot - gnuplot - 绘图范围与轴范围不同