相关疑难解决方法(0)

为什么使用purrr :: map而不是lapply?

我有什么理由可以使用

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::maplapply假设使用标准评估的比较,即map(<list-like-object>, function(x) <do stuff>).purrr::map在性能,异常处理等方面是否有任何优势?下面的评论表明它没有,但也许有人可以详细说明一点?

r purrr

148
推荐指数
4
解决办法
3万
查看次数

如何使用data.table:=有效地计算坐标对之间的距离

我想找到最有效(最快)的方法来计算lat长坐标对之间的距离.

已经提出了一个不太有效的解决方案(这里)使用sapplyspDistsN1{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.table

odmatrix[ …
Run Code Online (Sandbox Code Playgroud)

r geospatial data.table r-sp

11
推荐指数
2
解决办法
5739
查看次数

(空间)找到一点内X米内所有点的有效方法?

我有一个大的空间数据集(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)

r r-sf

9
推荐指数
1
解决办法
1341
查看次数

标签 统计

r ×3

data.table ×1

geospatial ×1

purrr ×1

r-sf ×1

r-sp ×1