如何绕过嵌套的for循环?

Ale*_*sen 4 loops r

所以情况是这样的:我基本上有一个数据框,其中包含大约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循环的情况下进行此操作?

Tim*_*sen 6

这是一个相当普遍的问题,可能发生在数据库的上下文中.这是一个解决方案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 POSSELECT DISTINCT POS.


akr*_*run 6

我们可以使用非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)