【问题标题】:Filtering the dataframe by matching values of two columns in different rows通过匹配不同行中两列的值来过滤数据框
【发布时间】:2018-11-16 09:43:08
【问题描述】:

这是一个与Filtering the dataframe by matching values of two columns 非常相似的问题,但我认为仍然不同。在示例中,只需要在同一行的值上匹配两列。我希望根据两列中的匹配值过滤 data.table,这可以分散在 data.table 的整个范围内。

生成的 data.table 应该如下所示,它应该基本上过滤在msg_seq_nborig_msg_seq_nb 之间具有匹配值的行。我知道我可以通过合并两列上的两个 data.tables 来实现这一点,但我认为必须有一种更简单的方法,它可以防止合并以及这可能产生的额外开销。

 dt <- structure(list(cusip_id = c("00208J702", "00208J702", "00208J702", 
                        "00208J702", "010284AH0", "010284AH0", "010284AH0", "U9220JAC4", 
                        "U9220JAC4"), orig_msg_seq_nb = c(NA, NA, NA, NA, NA, NA, "0003081", NA, "0012889"), msg_seq_nb = c("0008911", "0009000", "0009075","0009152", "0031914", "0003081", "0003105", "0012889", "0017534" )), row.names = c(NA, -9L), class = c("data.table", "data.frame" ))

> dt
    cusip_id orig_msg_seq_nb msg_seq_nb
1: 00208J702            <NA>    0008911
2: 00208J702            <NA>    0009000
3: 00208J702            <NA>    0009075
4: 00208J702            <NA>    0009152
5: 010284AH0            <NA>    0031914
6: 010284AH0            <NA>    0003081
7: 010284AH0         0003081    0003105
8: U9220JAC4            <NA>    0012889
9: U9220JAC4         0012889    0017534

结果应该是这样的

    cusip_id orig_msg_seq_nb msg_seq_nb
1: 010284AH0            <NA>    0003081
2: 010284AH0         0003081    0003105
3: U9220JAC4            <NA>    0012889
4: U9220JAC4         0012889    0017534

请注意,msg_seq_nb 和 orig_msg_seq_nb 在此数据集中不是唯一的。

【问题讨论】:

  • 因此对于上面的示例,您将过滤掉所有观察到的cusip_id == 010284AH0?也许添加一个更大的例子以及预期的输出
  • 对于匹配的工作来说,尖端并不重要。 dt 基本上是想要的输出,最初的 data.table 是一样的,但列中的条目更多,不知道这样是否更容易获得。
  • 最好也给出初始表...不需要很多条目。只是还有一些没有进行过滤

标签: r dplyr data.table


【解决方案1】:

我能想到的最简单的方法:

dt[orig_msg_seq_nb %in% msg_seq_nb | msg_seq_nb %in% orig_msg_seq_nb, ]

    cusip_id orig_msg_seq_nb msg_seq_nb
1: 010284AH0              NA    0003081
2: 010284AH0         0003081    0003105
3: U9220JAC4              NA    0012889
4: U9220JAC4         0012889    0017534

【讨论】:

  • 很遗憾,这是不可能的,因为 msg_seq_nb 不是唯一的,而且匹配的次数会比正确的多得多。
  • @hannes101 如果您在msg_seq_nborig_msg_seq_nb 之间寻找匹配值,那么这种行为是正确的。如果要进一步减少行数,则需要一个附加条件。您要过滤那些cusip_id 也匹配的行吗?
  • 我刚刚读到 msg_seq_nb 在每个交易日都是唯一的,所以是的,我需要一个附加条件。我想我会合并这两个表。
  • @hannes101 您提供的示例无法测试此附加条件,所以我只能猜测,但您可以试试这个:ids &lt;- dt[orig_msg_seq_nb %in% msg_seq_nb, cusip_id]; dt[orig_msg_seq_nb %in% msg_seq_nb | (msg_seq_nb %in% orig_msg_seq_nb &amp; cusip_id %in% ids), ]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2021-12-12
相关资源
最近更新 更多