通过匹配不同行中两列的值来过滤数据框

时间:2018-11-16 09:43:09

标签: r dplyr data.table

这是一个与此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在此数据集中不是唯一的。

1 个答案:

答案 0 :(得分: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