我有什么理由可以使用
map(<list-like-object>, function(x) <do stuff>)
Run Code Online (Sandbox Code Playgroud)
代替
lapply(<list-like-object>, function(x) <do stuff>)
Run Code Online (Sandbox Code Playgroud)
输出应该是相同的,我做的基准似乎表明它lapply稍微快一些(它应该是map需要评估所有非标准评估输入).
那么有什么理由为什么这么简单的情况我应该考虑切换到purrr::map?我不是在这里问一个人对于语法,purrr等提供的其他功能的喜欢或不喜欢,而是严格地purrr::map与lapply假设使用标准评估的比较,即map(<list-like-object>, function(x) <do stuff>).purrr::map在性能,异常处理等方面是否有任何优势?下面的评论表明它没有,但也许有人可以详细说明一点?
我想找到最有效(最快)的方法来计算lat长坐标对之间的距离.
已经提出了一个不太有效的解决方案(这里)使用sapply和spDistsN1{sp}.我相信如果一个人会在运营商spDistsN1{sp}内部data.table使用,:=但我无法做到这一点,这可以更快.有什么建议?
这是一个可重复的例子:
# load libraries
library(data.table)
library(dplyr)
library(sp)
library(rgeos)
library(UScensus2000tract)
# load data and create an Origin-Destination matrix
data("oregon.tract")
# get centroids as a data.frame
centroids <- as.data.frame(gCentroid(oregon.tract,byid=TRUE))
# Convert row names into first column
setDT(centroids, keep.rownames = TRUE)[]
# create Origin-destination matrix
orig <- centroids[1:754, ]
dest <- centroids[2:755, ]
odmatrix <- bind_cols(orig,dest)
colnames(odmatrix) <- c("origi_id", "long_orig", "lat_orig", "dest_id", "long_dest", "lat_dest")
Run Code Online (Sandbox Code Playgroud)
data.tableodmatrix[ …Run Code Online (Sandbox Code Playgroud) 我有一个大的空间数据集(12M行).几何图形是地图上的点.对于数据集中的每一行,我想找到距离该点500米范围内的所有点.
在r中,使用sf,我一直试图通过并行循环遍历每一行并运行st_buffer和st_intersects来做到这一点,然后将结果保存为键值格式的列表(键是原点,值是邻居).
问题是数据集太大.即使并行化到超过60个核心,操作也需要很长时间(> 1周且通常会崩溃).
这种蛮力方法有哪些替代方案?是否可以使用sf构建索引?也许将操作推送到外部数据库?
Reprex:
library(sf)
library(tidyverse)
library(parallel)
library(foreach)
# example data, convert to decimal:
nc <- st_read(system.file("shape/nc.shp", package="sf")) %>% st_transform(32618)
# expand the data a a bit to make the example more interesting:
nc <- rbind(nc,nc,nc)
nc <- nc %>% mutate(Id = row_number())
## can run in parallel if desired:
# num_cores <- parallel::detectCores()-2
# cl <- makeSOCKcluster(num_cores)
# registerDoSNOW(cl)
# or just run in sequence:
registerDoSEQ()
neighbors <- foreach(ii = 1:nrow(nc)
, .verbose = FALSE
, .errorhandling …Run Code Online (Sandbox Code Playgroud)