代码之家  ›  专栏  ›  技术社区  ›  Marco_CH

根据动态相关的两个条件进行筛选

  •  2
  • Marco_CH  · 技术社区  · 3 年前

    我有一个大型数据集,其值为 CPE 还有一个百分比 PERC . 在现实世界中,情况略有不同,但我将其降至最低限度。

    | CPE|      PERC|
    |---:|---------:|
    |  42| 0.1132664|
    | 264| 0.9260718|
    | 470| 0.3732287|
    | 316| 0.7437126|
    |   9| 0.5819554|
    | 114| 0.2052649|
    

    现在我想过滤。少量的 CPE公司 需要更高的 PERC 集中注意力。

    我当然可以这样做:

    df[(CPE > 20 & PERC > 0.95) |
         (CPE > 50 & PERC > 0.9) |
         (CPE > 100 & PERC > 0.85) |
         (CPE > 250 & PERC > 0.8)]
    

    但由于现实世界中可能会有更多的问题,而且这些问题可能会不时发生变化,所以我正在寻找一种更简单、更动态的解决方案。
    类似于创建一个包含所有组合的列表,然后将每个组合用作筛选条件对。

    list(c(20, 0.95), c(50, 0.9), c(100,0.85), c(250,0.8))
    

    有没有聪明的方法来处理这个问题?即使我更喜欢 data.table , dplyr 也很棒。这还没有一个列表,我对任何类似的方法都持开放态度。


    MWE公司

    library(data.table)
    
    set.seed(33)
    
    df = data.table(CPE=sample(1:500, 100), 
                    PERC=runif(min = 0.1, max = 1, n=100))
    
    1 回复  |  直到 3 年前
        1
  •  4
  •   akrun    3 年前

    如果 list 已创建,我们可以在 列表 ,使用创建第一个和第二个元素的逻辑条件 CPE PERC 各列, Reduce 使用 | 并将数据子集

    df[Reduce(`|`, lapply(lst1, \(x) CPE > x[1] & PERC > x[2]))]
    

    数据

    lst1 <- list(c(20, 0.95), c(50, 0.9), c(100,0.85), c(250,0.8))
    
        2
  •  2
  •   IceCreamToucan    3 年前
    library(dplyr, warn.conflicts = FALSE)
    #> Warning: package 'dplyr' was built under R version 4.1.2
    library(purrr)
    
    df <- structure(list(CPE = c(42L, 264L, 470L, 316L, 9L, 114L), PERC = c(0.1132664, 
    0.9260718, 0.3732287, 0.7437126, 0.5819554, 0.2052649)), row.names = c(NA, 
    -6L), class = "data.frame")
    
    constraints <- structure(list(CPE = c(20, 50, 100, 250), PERC = c(0.95, 0.9, 
    0.85, 0.8)), class = "data.frame", row.names = c(NA, -4L))
    
    constraints
    #>   CPE PERC
    #> 1  20 0.95
    #> 2  50 0.90
    #> 3 100 0.85
    #> 4 250 0.80
    
    filt <- 
      map2(df, constraints, outer, '>') %>% 
        reduce(`&`) %>% 
        as.data.frame %>% 
        reduce(`|`)
    
    df %>% 
      filter(filt)
    #>   CPE      PERC
    #> 1 264 0.9260718
    

    创建日期:2022-06-03 reprex package (v2.0.1)