首页 > 解决方案 > R数据框按类别ID过滤多个逻辑条件

问题描述

我正在尝试过滤使用列索引(称为 Insider CIK)的数据框。我想使用逻辑测试来排除表中没有 P-Purchase 和 S-Sale 或 M-Exempt 的 CIK 编号。每行都是由相应的 CIK 编号标识的单独交易,有些可以是 P-Purchases 或 S-Sales,因此如果对于给定的 CIK 编号,如果它们是交易日志仅是一种类型,我想删除它们。我已经尝试过 dplyr 过滤器功能,但我这样做的方式只考虑每一行以及它是否满足条件而不是整个组(CIK 编号)。

这是我的示例脚本和一个 dput:

test8 <- test7 %>% group_by(`Insider CIK`) %>% filter(`Transaction Type`=='P-Purchase' & `Transaction Type`=='S-Sale' | `Transaction Type`=='M-Exempt')

dput(head(test7[c('Insider CIK', 'Transaction Type')], 100))
structure(list(`Insider CIK` = c("0001027035", "0001027035", 
"0001027035", "0001027035", "0001027035", "0001027035", "0001032553", 
"0001032553", "0001032553", "0001032553", "0001032553", "0001032553", 
"0001032553", "0001032553", "0001032553", "0001032553", "0001032553", 
"0001032553", "0001032553", "0001032553", "0001032553", "0001032553", 
"0001032553", "0001032553", "0001032553", "0001032553", "0001032553", 
"0001032553", "0001032553", "0001032553", "0001032553", "0001032553", 
"0001033331", "0001033331", "0001033331", "0001033331", "0001033331", 
"0001033331", "0001033331", "0001033331", "0001033331", "0001033331", 
"0001033331", "0001033331", "0001033331", "0001033331", "0001033331", 
"0001033331", "0001033331", "0001033331", "0001033331", "0001033331", 
"0001033331", "0001033331", "0001033331", "0001033331", "0001033331", 
"0001033331", "0001033331", "0001033331", "0001033331", "0001033331", 
"0001033331", "0001033331", "0001033331", "0001033331", "0001033331", 
"0001033331", "0001033331", "0001033331", "0001033331", "0001033331", 
"0001033331", "0001033331", "0001033331", "0001033331", "0001033331", 
"0001033331", "0001033331", "0001033331", "0001033331", "0001033331", 
"0001033331", "0001033331", "0001033331", "0001033331", "0001033331", 
"0001033331", "0001033331", "0001033331", "0001033331", "0001033331", 
"0001033331", "0001033331", "0001033331", "0001033331", "0001033331", 
"0001033331", "0001033331", "0001033331"), `Transaction Type` = c("S-Sale", 
"S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", 
"S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", 
"S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", 
"S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", 
"S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", 
"S-Sale", "S-Sale", "S-Sale", "S-Sale", "M-Exempt", "S-Sale", 
"S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "M-Exempt", 
"S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", 
"S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "M-Exempt", 
"S-Sale", "M-Exempt", "S-Sale", "S-Sale", "S-Sale", "S-Sale", 
"S-Sale", "S-Sale", "S-Sale", "S-Sale", "M-Exempt", "S-Sale", 
"M-Exempt", "S-Sale", "S-Sale", "S-Sale", "M-Exempt", "S-Sale", 
"S-Sale", "S-Sale", "S-Sale", "M-Exempt", "S-Sale", "S-Sale", 
"M-Exempt", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", 
"M-Exempt", "S-Sale", "S-Sale", "S-Sale", "S-Sale", "S-Sale", 
"S-Sale", "S-Sale", "S-Sale")), row.names = 2:101, class = "data.frame")

我很感激帮助。

标签: rdplyrtidyr

解决方案


这是一个选项data.table

library(data.table)
setDT(test7)[, .SD[any(`Transaction Type`=='P-Purchase') & 
    (any(`Transaction Type`=='S-Sale' | `Transaction Type`=='M-Exempt')],  by = `Insider CIK`]

推荐阅读