根据动态相关的两个条件进行过滤

Mar*_*_CH 2 r data.table

我有一个大型数据集,其值称为CPE,百分比为PERC。在现实世界中,它略有不同,但我将其减少到必要的最低限度。

| CPE|      PERC|
|---:|---------:|
|  42| 0.1132664|
| 264| 0.9260718|
| 470| 0.3732287|
| 316| 0.7437126|
|   9| 0.5819554|
| 114| 0.2052649|
Run Code Online (Sandbox Code Playgroud)

现在我想过滤。较小的量CPE需要较高的量PERC才能聚焦。

我当然可以这样做:

df[(CPE > 20 & PERC > 0.95) |
     (CPE > 50 & PERC > 0.9) |
     (CPE > 100 & PERC > 0.85) |
     (CPE > 250 & PERC > 0.8)]
Run Code Online (Sandbox Code Playgroud)

但由于现实世界中可能有更多,而且它们可能会不时变化,因此我正在寻找一种更简单、更动态的解决方案。
就像创建一个包含所有组合的列表,然后使用每个组合作为过滤条件对。

list(c(20, 0.95), c(50, 0.9), c(100,0.85), c(250,0.8))
Run Code Online (Sandbox Code Playgroud)

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


微量元素

library(data.table)

set.seed(33)

df = data.table(CPE=sample(1:500, 100), 
                PERC=runif(min = 0.1, max = 1, n=100))
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

如果list已经创建,我们可以循环,分别使用和列list将第一个和第二个元素创建逻辑条件,并使用数据子集创建单个逻辑向量CPEPERCReduce|

df[Reduce(`|`, lapply(lst1, \(x) CPE > x[1] & PERC > x[2]))]
Run Code Online (Sandbox Code Playgroud)

数据

lst1 <- list(c(20, 0.95), c(50, 0.9), c(100,0.85), c(250,0.8))
Run Code Online (Sandbox Code Playgroud)