【问题标题】:Filter rows in relation to value held within the same column根据同一列中保存的值过滤行
【发布时间】:2021-11-08 15:35:12
【问题描述】:

我有一个数据集,其中包含不同供应商的服务水平协议 (SLA) 分数,并希望每月使用 r/rmarkdown 生成一份报告,突出显示表现良好的供应商和表现不佳的供应商。

下面包含数据的代表。如何根据供应商是否达到基准分数来过滤数据?我希望它返回未达到相应基准分数的那些条目的供应商名称、SLA 和分数。 “此供应商和此 SLA 的分数是否高于相应的基准 SLA 分数?”

supplier_name <- c("benchmark", "benchmark", "benchmark", "supplier1", "supplier1", "supplier1", "supplier2", "supplier2", "supplier2", "supplier3", "supplier3", "supplier3")
sla <- c("sla1", "sla2", "sla3", "sla1", "sla2", "sla3", "sla1", "sla2", "sla3", "sla1", "sla2", "sla3")
score <- c("100", "95", "100", "100", "100", "99", "100", "98", "100", "80", "82", "95")
df <- tibble(supplier_name, sla, score)

我的数据形状合适吗?还是有一个包含基准分数的向量来进行比较更合适?

谢谢。

【问题讨论】:

  • 共享数据的预期输出是什么?

标签: r filter dplyr


【解决方案1】:

我会将它分成两个数据框,以便您可以将基准加入每个供应商。

library(dplyr)
benchmark <- df %>% filter(supplier_name == "benchmark")
suppliers <- df %>% filter(supplier_name != "benchmark")

suppliers %>% left_join(benchmark, by=c("sla"), suffix=c("", ".benchmark")) %>% filter(score < score.benchmark)

【讨论】:

    【解决方案2】:

    如果您想要图形方法,您可以尝试...

    注意,如果数据组织得更合理,这可以简化。 如果您有很多供应商,在点上添加抖动将有助于区分供应商。

    library(tibble)
    library(dplyr)
    library(ggplot2)
    
    
    df_bmk <- 
      df %>% 
      filter(supplier_name == "benchmark")
    
    df_sup <- 
      df %>% 
      filter(supplier_name != "benchmark") %>% 
      mutate(score = as.numeric(score))
    
    ggplot(df_sup, aes(sla, score, colour = supplier_name))+
      geom_point()+
      geom_hline(data = df_bmk, aes(yintercept = as.numeric(score)))+
      facet_wrap(~sla, scale = "free_x")+
      labs(x = NULL)+
      theme(axis.text.x = element_blank(),
            axis.ticks.x = element_blank())
    

    reprex package (v2.0.0) 于 2021-09-13 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多