r - 在 r 中返回指标排名
问题描述
数据子集如下:
Cat <- c('A','B','C')
Metrics1 <- c(1,4,3)
Metrics2 <- c(1.5,0.3,3.4)
Metrics3 <- c(0.1,40,3.2)
df <- data.frame(Cat,Metrics1,Metrics2,Metrics3)
我想以这样一种方式创建另一个数据框,即对于每个类别,我都会获得指标的排名(指标的最小值使其排名为 1),
示例输出如下:
解决方案
library(dplyr)
library(tidyr)
n_metrics <- 3
df %>%
pivot_longer(cols = c(Metrics1, Metrics2, Metrics3), names_to = "Metrics") %>%
group_by(Cat) %>% arrange(Cat,value) %>%
mutate(Performance = paste0("Best-",1:n_metrics)) %>%
dplyr::select(Cat, Performance, Metrics)
# A tibble: 9 x 3
# Groups: Cat [3]
Cat Performance Metrics
<chr> <chr> <chr>
1 A Best-1 Metrics3
2 A Best-2 Metrics1
3 A Best-3 Metrics2
4 B Best-1 Metrics2
5 B Best-2 Metrics1
6 B Best-3 Metrics3
7 C Best-1 Metrics1
8 C Best-2 Metrics3
9 C Best-3 Metrics2
只要您拥有三个 MetricScore,这种方法就可以使用。如果您需要更多,则需要调整n_metrics。
首先,我们使用tidyr::pivot_longer使您的数据帧更长。然后我们按Cat分组并相应地排列值(默认为递增)。然后我们添加性能度量(因为指标已经排序)。
推荐阅读
- flutter - 为什么 Map 和 List 可以实例化,但它们是 dart 中的抽象类
- vb.net - 在不知道泛型类型的情况下转换为泛型类型
- c++ - 使用新值而不是实际值的 C++ 类析构函数
- spring - 根据环境注入特定的bean是好还是坏?
- c++11 - 通过 std:is_base_of 推导出模板参数
- git - 如何推送在 git 子模块中所做的更改?
- boolean-logic - 仅使用最多 4 个门的 XNOR、NAND 或 OR 实现 Mux 2:1
- ffmpeg - ffplay 启动时间与指定帧率成正比
- angular - 将值分配到导入的数据模型中
- ios - 向 LSApplicationQueriesSchemes 添加了方案,但 canOpenURL 仍然失败