我在R中有两组点存储为“sf”对象。点对象x包含204,467个点,而点对象y包含5,297个点。
理论上,我想计算从x中的所有点到y中的所有点的距离。我知道这将创建一个庞大的矩阵,但是使用“sf”包中的“st_distance(x, y, by_element=FALSE)”函数,在我的i7台式机上大约需要40分钟就可以完成。
我想要做的是计算从x中的所有点到y中的所有点的距离,然后将其转换为一个包含相应x和y点对的所有变量的“data.frame”。这是因为我希望能够使用“dplyr”进行灵活的聚合操作,例如,我想找出距离x在10、50、100公里范围内的y点的数量,并且满足“x$year < y$year”的条件。
我成功地创建了距离矩阵,其中包含大约1,083,061,699个单元格。我知道这种方法非常低效,但它提供了灵活的聚合方式。欢迎提出其他建议。
以下是创建两个sf点对象并测量它们之间距离的代码。接下来,我想将其转换为一个包含x和y所有变量的数据框,但这就是我无法继续的地方。
如果我的建议的工作流程行不通,有人能提供一个替代解决方案来测量预定义半径内所有点的距离,并创建一个包含x和y所有变量的结果数据框吗?
理论上,我想计算从x中的所有点到y中的所有点的距离。我知道这将创建一个庞大的矩阵,但是使用“sf”包中的“st_distance(x, y, by_element=FALSE)”函数,在我的i7台式机上大约需要40分钟就可以完成。
我想要做的是计算从x中的所有点到y中的所有点的距离,然后将其转换为一个包含相应x和y点对的所有变量的“data.frame”。这是因为我希望能够使用“dplyr”进行灵活的聚合操作,例如,我想找出距离x在10、50、100公里范围内的y点的数量,并且满足“x$year < y$year”的条件。
我成功地创建了距离矩阵,其中包含大约1,083,061,699个单元格。我知道这种方法非常低效,但它提供了灵活的聚合方式。欢迎提出其他建议。
以下是创建两个sf点对象并测量它们之间距离的代码。接下来,我想将其转换为一个包含x和y所有变量的数据框,但这就是我无法继续的地方。
如果我的建议的工作流程行不通,有人能提供一个替代解决方案来测量预定义半径内所有点的距离,并创建一个包含x和y所有变量的结果数据框吗?
# Create two sf point objects
set.seed(123)
library(sf)
pts1 <- st_as_sf(x = data.frame(id=seq(1,204467,1),
year=sample(seq(from = 1990, to = 2018, by = 1), size = 204467, replace = TRUE),
xcoord=sample(seq(from = -180, to = 180, by = 1), size = 204467, replace = TRUE),
ycoord=sample(seq(from = -90, to = 90, by = 1), size = 204467, replace = TRUE)),
coords=c("xcoord","ycoord"),crs=4326)
pts2 <- st_as_sf(x = data.frame(id=seq(1,5297,1),
year=sample(seq(from = 1990, to = 2018, by = 1), size = 5297, replace = TRUE),
xcoord=sample(seq(from = -180, to = 180, by = 1), size = 5297, replace = TRUE),
ycoord=sample(seq(from = -90, to = 90, by = 1), size = 5297, replace = TRUE)),
coords=c("xcoord","ycoord"),crs=4326)
distmat <- st_distance(pts1,pts2,by_element = FALSE)