r - 根据动态依赖的两个条件过滤

标签 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|

现在我要过滤。较少的 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.tabledplyr 也很棒。它不是一个列表,我对任何类似的方法持开放态度。


MWE

library(data.table)

set.seed(33)

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

最佳答案

如果 list 已经创建,我们可以遍历 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))

关于r - 根据动态依赖的两个条件过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72492456/

相关文章:

r - 如何在R中使用cbind合并两个csv?

r - R 中的复杂算法与 data.tables 使用先前的行值

r - 在 R data.table 中计算总和的每个变量的聚合

R 数据表 : reuse an aggregation

r - 根据另一列中的值和分组创建一个新的 r data.table 列

r - R中许多矩阵的乘法

递归表达式 : If you fail, 上的 R 警告消息尝试,再试一次

r - 如何从POSIXct和POSIXlt对象中提取正确的时区?

r - 在 j 中使用大括号 {...}

r - 将下采样后的预测概率转换为分类中的实际概率(使用 mlr)