R环境下如何筛选未达benchmark的供应商SLA得分数据行
数据结构评估
你当前的长表结构可以直接使用,但有两个优化点:
- 现有
score列为字符型,需要先转换为数值型才能正确做大小比较,避免字符排序逻辑(如"99">"100")导致的判断错误 - 把benchmark数据和供应商得分放在同一张表,每次判断前都需要先提取基准值,如果你每月生成报告时SLA基准调整频率低,单独存储benchmark得分会更方便维护,修改基准时不需要触碰供应商得分数据,降低误改风险。如果SLA项固定很少变动,用向量存储即可;如果SLA项经常增删、基准分需要按月调整,建议单独维护一张基准表(比如存为csv文件),自动化报告时直接读取即可。
未达标供应商筛选代码
基于现有表结构的实现
library(tidyverse) # 1. 转换得分列为数值型 df <- df %>% mutate(score = as.numeric(score)) # 2. 提取基准得分表 benchmark_ref <- df %>% filter(supplier_name == "benchmark") %>% select(sla, benchmark_score = score) # 3. 筛选未达标条目 unqualified_list <- df %>% filter(supplier_name != "benchmark") %>% left_join(benchmark_ref, by = "sla") %>% filter(score < benchmark_score) %>% select(supplier_name, sla, score, benchmark_score)
运行后得到的unqualified_list就是所有未达标的供应商条目,同时自带基准分可以直接放到报告里做对比标注。
单独存储基准向量的实现
如果SLA项固定,用这种写法更简洁:
# 定义基准得分向量,键为SLA项名称,值为对应基准分 benchmark_vec <- c(sla1 = 100, sla2 = 95, sla3 = 100) unqualified_list <- df %>% mutate(score = as.numeric(score)) %>% filter(supplier_name != "benchmark") %>% filter(score < benchmark_vec[sla]) %>% select(supplier_name, sla, score)
额外拓展
如果需要标注表现优秀的供应商,只要把筛选条件改成score >= benchmark_score即可,还可以新增列计算得分差值,用来在报告里做高亮标注,适配R Markdown的自动化输出需求。
内容的提问来源于stack exchange,提问作者Anonymous Economist
相关产品推荐
相关产品推荐

