如何在R中查找两个数据帧中的重叠行?

如何在R中查找两个数据帧中的重叠行?,r,coordinates,R,Coordinates,我有两个坐标数据框。每个数据帧有两个“设置”坐标和一个坐标,坐标是一个范围(由范围的开始和结束的两列表示)。实际数据帧非常大,约40000行。以下是一些虚拟数据: hdata<-data.frame(distance=c(1:12),x=c(1,1,1,1,1,1,2,2,2,2,2,2),z=c(1,1,1,2,2,2,1,1,1,2,2,2), ystart=c(0.5,3,3,3,3,1.5,3,3,3,1.5,1.5,0.5),yend=c(1.

我有两个坐标数据框。每个数据帧有两个“设置”坐标和一个坐标,坐标是一个范围(由范围的开始和结束的两列表示)。实际数据帧非常大,约40000行。以下是一些虚拟数据:

    hdata<-data.frame(distance=c(1:12),x=c(1,1,1,1,1,1,2,2,2,2,2,2),z=c(1,1,1,2,2,2,1,1,1,2,2,2),
              ystart=c(0.5,3,3,3,3,1.5,3,3,3,1.5,1.5,0.5),yend=c(1.5,4,4,4,4,2.5,4,4,4,2.5,2.5,1.5))
vdata<-data.frame(distance=c(1:12),x=c(1,1,1,1,1,1,2,2,2,2,2,2),y=c(1,1,1,2,2,2,1,1,1,2,2,2),
              zstart=c(0.5,3,1.5,3,3,3,3,3,1.5,1.5,1.5,3),zend=c(1.5,4,2.5,4,4,4,4,4,2.5,2.5,2.5,4))


> vdata
#   distance x z ystart yend
#1         1 1 1    0.5  1.5
#2         2 1 1    3.0  4.0
#3         3 1 1    3.0  4.0
#4         4 1 2    3.0  4.0
#5         5 1 2    3.0  4.0
#6         6 1 2    1.5  2.5
#7         7 2 1    3.0  4.0
#8         8 2 1    3.0  4.0
#9         9 2 1    3.0  4.0
#10       10 2 2    1.5  2.5
#11       11 2 2    1.5  2.5
#12       12 2 2    0.5  1.5

> hdata
#   distance x y zstart zend
#1         1 1 1    0.5  1.5
#2         2 1 1    3.0  4.0
#3         3 1 1    1.5  2.5
#4         4 1 2    3.0  4.0
#5         5 1 2    3.0  4.0
#6         6 1 2    3.0  4.0
#7         7 2 1    3.0  4.0
#8         8 2 1    3.0  4.0
#9         9 2 1    1.5  2.5
#10       10 2 2    1.5  2.5
#11       11 2 2    1.5  2.5
#12       12 2 2    3.0  4.0
此虚拟数据集的正确输出应为:

> results
   vdistance hdistance x ystart yend zstart zend
1          1         1 1    0.5  1.5    0.5  1.5
2         12         9 2    0.5  1.5    1.5  2.5
3         10        10 2    1.5  2.5    1.5  2.5
4         11        10 2    1.5  2.5    1.5  2.5
5         10        11 2    1.5  2.5    1.5  2.5
6         11        11 2    1.5  2.5    1.5  2.5
我制作了一组非常缓慢而复杂的嵌套for循环和if/elseif语句,试图对它们进行排序。对于我庞大的数据集来说,这花费的时间太长了。我试图通过将数据帧按x和y、x和z进行拆分,然后只检查每个帧的第一个x坐标,并通过按ystart和zstart列排序,然后在z或y超出范围时停止,来加快速度,但速度仍然太慢


有什么更好的方法吗?

考虑使用条件过滤器进行合并:

mdf <- merge(hdata, vdata, by="x")

finaldf <- mdf[(mdf$z >= mdf$zstart & mdf$z <= mdf$zend) &
               (mdf$y >= mdf$ystart & mdf$y <= mdf$yend),]  

rownames(finaldf) <- seq(nrow(finaldf))
colnames(finaldf) <- c("x", "hdistance", "z", "ystart", "yend", 
                            "vdistance", "y", "zstart", "zend")
finaldf <- finaldf[c("hdistance", "vdistance", "x", 
                     "ystart", "yend", "zstart", "zend")]

finaldf
#   hdistance vdistance x ystart yend zstart zend
# 1         1         1 1    0.5  1.5    0.5  1.5
# 2        10        10 2    1.5  2.5    1.5  2.5
# 3        10        11 2    1.5  2.5    1.5  2.5
# 4        11        10 2    1.5  2.5    1.5  2.5
# 5        11        11 2    1.5  2.5    1.5  2.5
# 6        12         9 2    0.5  1.5    1.5  2.5

mdf在
数据的开发版本(1.9.7)中的非对等连接。表将执行此操作。另请参见中的第3项,其中有一些示例说明了如何执行此操作,并显示了非equi联接的实际操作(他是data.table的联合开发人员),感谢您提供了有用的链接SymbolX!非常感谢你!它对我的测试数据集很有效。当我在40000行数据帧上尝试它时,它在合并步骤上卡住了,这非常慢。。。然而,我意识到我实际上连接数据太早了,当我在较小的子集(约6000行)上运行数据时,它工作得很好。(合并步骤需要~4秒,其余步骤需要~1秒)太棒了!总是喜欢听到解决方案在现实生活中是如何工作的。很高兴我能帮忙。
mdf <- merge(hdata, vdata, by="x")

finaldf <- mdf[(mdf$z >= mdf$zstart & mdf$z <= mdf$zend) &
               (mdf$y >= mdf$ystart & mdf$y <= mdf$yend),]  

rownames(finaldf) <- seq(nrow(finaldf))
colnames(finaldf) <- c("x", "hdistance", "z", "ystart", "yend", 
                            "vdistance", "y", "zstart", "zend")
finaldf <- finaldf[c("hdistance", "vdistance", "x", 
                     "ystart", "yend", "zstart", "zend")]

finaldf
#   hdistance vdistance x ystart yend zstart zend
# 1         1         1 1    0.5  1.5    0.5  1.5
# 2        10        10 2    1.5  2.5    1.5  2.5
# 3        10        11 2    1.5  2.5    1.5  2.5
# 4        11        10 2    1.5  2.5    1.5  2.5
# 5        11        11 2    1.5  2.5    1.5  2.5
# 6        12         9 2    0.5  1.5    1.5  2.5