【问题标题】:Distance to nearest point by group using sf使用 sf 按组到最近点的距离
【发布时间】:2019-02-20 23:28:07
【问题描述】:

我有一个类似于以下示例的数据集。对于每个code,我想计算与它属于同一area 的下一个最近代码的距离。因此,在我的示例中,对于属于区域 A001 的每个代码,我将位于数据集中的附加列之后,该列包含与属于区域 A001 的其他点之一的最小距离。我认为应该有一种方法可以使用st_distance 来实现这一点?

require("data.table")
require("sf")

dt1 <- data.table(
code=c("A00111", "A00112","A00113","A00211","A00212","A00213","A00214","A00311","A00312"),
area=c("A001", "A001","A001","A002","A002","A002","A002","A003","A003"),
x=c(325147,323095,596020,257409,241206,248371,261076,595218,596678),
y=c(286151,284740,335814,079727,084266,078283,062045,333889,337836))

sf1 <- st_as_sf(dt1, coords = c("x","y"), crs=27700, na.fail=FALSE)

【问题讨论】:

    标签: r data.table distance sf


    【解决方案1】:

    可能有一种“更清洁”的方式可以到达这里,但这会为您提供正确的值。

    library(tidyverse)
    
    # intermediate fun to help later in apply()
    smallest_non_zero <- function(x) {
      min_val <- min(x[x != 0])
      x[match(min_val, x)]
    }
    
    closest_grp_distances <- sf1 %>%
      group_split(area) %>%
      map(~st_distance(., .) %>% # returns matrix
           apply(1, smallest_non_zero)) %>%
      unlist()
    
    sf1$closest_grp_distances <- closest_grp_distances
    

    我想使用 baseR split,但它没有 sf 对象的方法。

    【讨论】:

    • 我收到以下错误:UseMethod("st_geometry") 中的错误:没有适用于 'st_geometry' 的方法应用于类“c('tbl_df', 'tbl', ' data.frame')"
    • 嗯,你能说出发生在哪一步吗?我的猜测是st_distance()。比较软件包版本也是一个好主意,这里是我的 forcats_0.3.0、stringr_1.4.0、dplyr_0.8.0.1、purrr_0.3.0、readr_1.3.1、tidyr_0.8.2、tibble_2.0.1、ggplot2_3.1.0、tidyverse_1.2.1、 sf_0.7-3,data.table_1.12.0
    • 真的没有必要加载整个tidyverse,所以真正重要的包是sfdata.tabledplyrpurrr
    • 我的包版本是:purrr_0.3.0、dplyr_0.8.0.1、data.table_1.12.0、sf_0.7-2。也许与不同版本的 sf 有关?
    • 看来今天是 sf 0.7-3 发布的日子。一旦有机会更新,我将尝试使用我的真实数据。
    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2014-08-13
    • 2012-11-20
    相关资源
    最近更新 更多