我有一个大型数据集,其值称为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.table,dplyr也很棒。这不是一个列表,我对任何类似的方法持开放态度。
微量元素
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)
如果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)