当已知近似 GPS 坐标到街角位置时,R 填充缺失的文本数据,即非常接近的 gps 坐标

R filling in missing text data when an approximate GPS coordinate is known down to the street corner level of position, i.e. very close gps coordinate

使用 RI 我有一个包含 3,000,000 个观察值和 17 列的数据集。 start_at。纬度。长。 位置 1. x.11。 y.11 位置 2 x.12。 y.11 位置3。 x.11。 y.12 位置4。 x.13。 y.13 . x.10。 y.12 位置3。 x.10 y.12

其中两列缺少位置名称数据,共 150,000 个。 两列是 GPS 纬度和经度,列的每一行都填充了值。 这些值表示自行车租赁站的 gps 坐标(其中 750 个) 我想通过比较已知的列名称与已知的 gps 坐标来匹配并填充空白,从而在车站列中填写缺失的名称。

此外,每个站点的 gps 坐标并不准确,但坐标足够精确,因此每个插槽的坐标都略有不同,因此每个站点名称都与一个坐标范围相关联。

station_name. Lat.  long.
X              91.1234  -87.4848
y              93.1245. -87.9876
z              92.8488. -86.8765
z              92.8478. -86.8800
x              91.1245. -87.5000
missing.       91.1233  -87.4850

我需要知道如何用 'x' 填充 'missing',因为这是 lat/long.

的最近观察范围

除了在 3,000,000 行的 df 中,在 700 个唯一站名中缺少 150,000 个站名,我会手动执行此操作。

有没有办法说'如果 lat +/- x(范围)然后找到另一个在该范围内具有 gps 的站点名称。 或者.

如何找到已知站名的最小和最大坐标并将该站名插入到 缺少观察。 或者.

如何标准化所有 GPS 坐标,以便只有一个坐标与每个站点名称匹配。 IE。查看一个唯一的站名,将其所有已知坐标归一化为一对,然后填写该站缺少的名称。

你可以在这里使用精彩的s2包:

library(s2)
library(dplyr)

df <- data.frame(station_name = c("a", "b", "c", "d", "e", "missing"), 
                 lat = c(81.1234, 83.1245, 82.8488, 82.8478, 81.1245, 81.1233), 
                 lon = c(-87.4848, -87.9876, -86.8765, -86.8800, -87.5000, -87.4850))

创建两个数据框:


# data.frame with missings
df_missings <- df %>%
  filter(station_name == "missing")

# data.frame without missings
df_nomissings <- df %>%
  filter(station_name != "missing")

s2_closest_feature() 来自 s2 包从不同的数据集中找到最近的点。

missings_s2 <- s2_lnglat(df_missings$lon, df_missings$lat)
nomissings_s2 <- s2_lnglat(df_nomissings$lon, df_nomissings$lat)
df_missings$station_name <- df$station_name[s2_closest_feature(missings_s2, nomissings_s2)]

将data.frames绑定在一起:

bind_rows(df_missings, df_nomissings)

并且如果您只想在站点在一定半径内时替换站点名称:

library(spatialrisk)

df_missings1 <- df %>%
  filter(station_name == "missing")

df_missings1$closest_station <- df$station_name[s2_closest_feature(missings_s2, nomissings_s2)]

# Radius in meters
radius_meters <- 100

# Find distance to closest station
df_closest <- df_missings1 %>%
  left_join(., df_nomissings, by = c("closest_station" = "station_name")) %>%
  mutate(distance = spatialrisk::haversine(lat.x, lon.x, lat.y, lon.y)) %>% # in meters
  mutate(station_name = ifelse(distance < radius_meters, closest_station, station_name)) 

df_closest %>%
  select(station_name, lat = lat.x, lon = lon.x) %>%
  bind_rows(df_nomissings)