按 2 个成对向量子集/过滤 data.table

Dav*_*RGP 4 r data.table

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

library(data.table)
library(nycflights13)
flights <- data.table(flights)
Run Code Online (Sandbox Code Playgroud)

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

subDT <- data.table(sub_orig = c("EWR", "LGA"), sub_dest = c("IAH", "ATL"))
subDT
Run Code Online (Sandbox Code Playgroud)

我希望flights在原点"EWR"和目的地"IAH"完全相同的那些行中查找和子集(即像 using &),并且还在同一个查询中返回原点"LGA"和目的地的行"ATL"

flights[dest %in% subDT[, sub_dest] & origin %in% subDT[, sub_orig]]
Run Code Online (Sandbox Code Playgroud)

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

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

注意,我的最终用例实际上将使用字符向量的组合作为一列,并将数字因子作为另一列,如果这很重要的话。

Dav*_*urg 5

您可以尝试对两列进行二元连接,既高效又实现“”逻辑

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
Run Code Online (Sandbox Code Playgroud)

或者,v1.9.6+你也可以做

res <- flights[subDT, on = c(dest = "sub_dest", origin = "sub_orig")]
Run Code Online (Sandbox Code Playgroud)