【问题标题】:R: Applying a function to two different tables based on a condition (Spatial Join)R:根据条件将函数应用于两个不同的表(空间连接)
【发布时间】:2021-02-25 23:56:09
【问题描述】:

我怀疑这是相当微不足道的,但我对 R 也很陌生,到目前为止还没有找到解决方案。

我有两个事件表,A 和 B,每个都包含带有空间信息(纬度和经度)和日期的点。两者都是sf 对象。表 A 的事件少于表 B。

两个表中的数据如下所示:

ID date lat lon
1 2020/01/01 44.62 34.88

对于来自 A 的每个点,我想找到离 B 最近的邻居 - 但仅限于那天的事件。然后将其 ID 和距离添加到新列。执行空间连接的函数是来自nngeo 包的st_join,效果很好。

换句话说,我希望程序在表 A 中获取一个事件,然后在表 B 中获取同一天的每个事件,然后应用 st_join 函数。它应该遍历 A 中的每个事件并重复相同的过程。

我认为这需要for...if...else 声明,但我无法理解它的外观,特别是因为涉及到两个不同的表。就像我说的,我是 R 新手。

到目前为止,我的想法是这样的:

for (row in AW_sf){
      if (AW_sf$date == OIR_sf$date){
        SpacialJoin <- st_join(AW_sf, OIR_sf, join = st_nn, k = 1)
      } 
      else {
    print ("Done")
  } 
}

这不起作用,而且似乎也是错误的。因此,它会产生 12 个警告,如下所示:

  In `==.default`(AW_sf$date, OIR_sf$date) :
  longer object length is not a multiple of shorter object length
2: In if (AW_sf$date == OIR_sf$date) { ... :
  the condition has length > 1 and only the first element will be used

我希望我表达得有点清楚,如果有什么不清楚的地方,我很抱歉。我会非常感谢任何想法或帮助!

【问题讨论】:

  • 你可能想要fuzzyjoin::geo_inner_join
  • 这个功能看起来很棒,谢谢!但是,我不知道如何使用该功能,只能比较同一天的点
  • 我认为你可以使用inner_join(tidyr::nest_by(df1, date, .key="dat1"), tidyr::nest_by(df2, date, .key="dat2")) %&gt;% purrr::map2(dat1, dat2, ~ geo_inner_join(...)) 或类似的。如果您不熟悉嵌套数据集的 tidyr 概念,那么您似乎不太可能拥有有效的截止日期决定因素。

标签: r sf


【解决方案1】:

我想通了,这不是我认为的最优雅或最快速的解决方案,但它比我想象的要简单得多,而且它使用 r2evans 建议的函数解决了问题。

 EventPairs <- A %>%   geo_join(B, by=c("longitude", "latitude"), unit =
 c("km"), max_dist = 20, distance_col = "distance") %>%   filter(date.x
 == date.y)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-23
    • 2016-11-18
    • 2017-11-30
    • 2020-10-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多