【发布时间】: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")) %>% purrr::map2(dat1, dat2, ~ geo_inner_join(...))或类似的。如果您不熟悉嵌套数据集的tidyr概念,那么您似乎不太可能拥有有效的截止日期决定因素。