这是一个与此Filtering the dataframe by matching values of two columns类似的问题,但我认为仍然不同。在示例中,只需要匹配同一行的值的两列。我正在寻找在两列匹配值上过滤data.table的方法,这些值可以分散在data.table的整个范围内。
生成的data.table应该看起来像这样,它基本上应该过滤在msg_seq_nb
和orig_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在此数据集中不是唯一的。
答案 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