所以情况是这样的:我基本上有一个数据框,其中包含大约100,000行数据.我对特定的数据列POS感兴趣,我想检查POS的值是否在另一个数据框的两个值之间,即开始和结束,并跟踪那些数据的实例数.
例如,在我的第一个数据框中,我有类似的东西
ID POS
A 20
B 533
C 600
Run Code Online (Sandbox Code Playgroud)
在我的其他数据框架中,我有类似的东西
START END
123 150
489 552
590 600
Run Code Online (Sandbox Code Playgroud)
我想知道POS中有多少项在START-END范围内.所以在这种情况下,有两个项目.另外,如果可能的话,我也可以在开始和结束之间获得POS的ID吗?
如何在不使用嵌套for循环的情况下进行此操作?
这是一个相当普遍的问题,可能发生在数据库的上下文中.这是一个解决方案sqldf:
library(sqldf)
query <- "SELECT POS, ID FROM df1 INNER JOIN df2 "
query <- paste0(query, "ON df1.POS BETWEEN df2.START AND df2.END")
sqldf(query)
Run Code Online (Sandbox Code Playgroud)
如果第二个数据框中的范围可能重叠,则上述查询可能会返回给定POS值的多个结果.在这种情况下,更换SELECT POS用SELECT DISTINCT POS.
我们可以使用非equi连接 data.table
library(data.table)
setDT(df1)[df2, on = .(POS > START, POS <= END)][, sum(!is.na(ID))]
#[1] 2
Run Code Online (Sandbox Code Playgroud)