gpt4 book ai didi

R:将一个(大)数据框的坐标匹配到另一个(大)数据框的网格单元中

转载 作者:行者123 更新时间:2023-12-05 01:07:49 28 4
gpt4 key购买 nike

我有一个包含 X-Y 坐标的大数据框(~200,000 行),例如:

points <- data.frame(X = c(1,3,2,5,4), Y = c(4,3,2,2,1))

另一个大数据框(~1,000,000 行)包含空间(矩形)网格的角单元,例如:
MINX <- rep(0.5:5.5,6)
MINY <- rep(0.5:5.5,each=6)
grid <- data.frame(GridID = 1:36, MINX, MINY, MAXX = MINX+1, MAXY = MINY+1)

我想在“点”数据框中添加一列,用于标识点所在网格的 ID:
X Y GridID
1 4 19
3 3 15
2 2 8
5 2 11
4 1 4

我可以想到几种方法来做到这一点,使用循环,使用应用和匹配的组合,甚至从 sp 中拔出一些大空间枪或 maptools .但一切都太慢了。我有一种预感 data.table()一个可以在合理时间内完成的类轮。有没有大师有想法?

(作为记录,这就是我获得上述网格单元 ID 的方式:
pt.minx <- apply(points,1, 
function(foo) max(unique(grid)$MINX[unique(grid)$MINX < foo[1]]))
pt.miny <- apply(points,1,
function(foo) max(unique(grid)$MINY[unique(grid)$MINY < foo[2]]))
with(grid, GridID[match(pt.minx+1i*pt.miny, MINX + 1i*MINY)])

我无法从这里判断它是光滑还是丑陋 - 无论哪种方式,apply 函数对于完整的数据框来说都太慢了。)

最佳答案

以 SQL[df] 方式执行此操作:

require(sqldf)
sqldf("select X, Y, GridID from grid, pts
where MINX < X and X < MAXX and MINY < Y and Y < MAXY")

扩展@Roland 的评论,您可以使用 findInterval这里:
MINX <- MINY <- 0.5:5.5
x <- findInterval(pts$X, MINX)
y <- findInterval(pts$Y, MINY)
grid$GridID[match(MINX[x]+1i*MINY[y], grid$MINX+1i*grid$MINY)]

强制转换为二维匹配的好技巧,顺便说一句。

关于R:将一个(大)数据框的坐标匹配到另一个(大)数据框的网格单元中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18073861/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com