子集/过滤data.table由2个配对向量

时间:2015-11-16 12:13:26

标签: r data.table

如何获取data.table对象,并通过另一个表中的两个配对向量在两列上有条件地对其进行子集化。例如,我有一张航班表:

library(data.table)
library(nycflights13)
flights <- data.table(flights)

我还有另一个包含配对列的data.table:

subDT <- data.table(sub_orig = c("EWR", "LGA"), sub_dest = c("IAH", "ATL"))
subDT

我希望在flights中查找和归类原点为"EWR"且目的地为"IAH"的行(如使用&)以及相同的查询返回原点为"LGA"且目的地为"ATL"的行。

flights[dest %in% subDT[, sub_dest] & origin %in% subDT[, sub_orig]]

上面包含了我想要的数据,即上面指定的那些配对,但它也包含我不想要的"EWR" & "ATL""LGA" & "IAH"配对。

我意识到我可以创建一个假助手列(例如paste(dest, origin))并通过%in%选择,但我觉得有更好的方法,可能是setkey的一些魔法目前逃脱了我?

N.B。我的最终用例实际上是将字符向量组合为一列,将数字因子组合为另一列,如果这很重要的话。

1 个答案:

答案 0 :(得分:4)

您可以在两列上尝试二进制连接,这两个列都有效并实现“”逻辑

res <- setkey(flights, dest, origin)[J(subDT$sub_dest, subDT$sub_orig)]
res[, table(dest, origin)]
#      origin
# dest    EWR   LGA
#   ATL     0 10263
#   IAH  3973     0

或者,使用v1.9.6+您也可以

res <- flights[subDT, on = c(dest = "sub_dest", origin = "sub_orig")]