【问题标题】:R Data Frame filter by Category ID for multiple logical conditionsR数据框按类别ID过滤多个逻辑条件
【发布时间】:2020-04-13 14:28:12
【问题描述】:

我正在尝试过滤使用列索引(称为 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")

感谢您的帮助。

【问题讨论】:

  • 您没有提供 test7,所以您的代码不允许我们重现您的问题
  • 您需要test7 %&gt;% group_by(`Insider CIK`) %&gt;% filter(any(`Transaction Type`=='P-Purchase') &amp; (any(`Transaction Type`=='S-Sale' | `Transaction Type`=='M-Exempt'))) 吗?
  • 您提供的子集只有一个 Transaction Type 值。考虑提供更大的数据样本。
  • 添加“any”即可。非常感谢您提供的非常有用的建议。

标签: r dplyr tidyr


【解决方案1】:

这是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`]

【讨论】:

    【解决方案2】:

    我们可以检查条件并使用any 来获取整个组:

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

    【讨论】:

    • 这是检查类别的一种非常有用的方法。谢谢。
    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多