如何在R中查找两个数据帧中的重叠行?
我有两个坐标数据框。每个数据帧有两个“设置”坐标和一个坐标,坐标是一个范围(由范围的开始和结束的两列表示)。实际数据帧非常大,约40000行。以下是一些虚拟数据:如何在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.
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