R通过匹配gps坐标外推缺失数据,找到缺失数据,然后将缺失数据放回原始数据帧

R通过匹配gps坐标外推缺失数据,找到缺失数据,然后将缺失数据放回原始数据帧,r,missing-data,R,Missing Data,我的数据帧在end_station_id中缺少一些数据。它作为csv文件(3489749行)正确读入,其中147242行作为NA缺少数据 我想通过使用已知end_station_id的end latitude/longitude对查找匹配项来填充缺少的end_station_id ```{r} end_station_id <chr> end_lat<dbl> end_lng <dbl> NA 41.92

我的数据帧在end_station_id中缺少一些数据。它作为csv文件(3489749行)正确读入,其中147242行作为NA缺少数据

我想通过使用已知end_station_id的end latitude/longitude对查找匹配项来填充缺少的end_station_id

```{r}
end_station_id <chr>  end_lat<dbl> end_lng <dbl>
NA                           41.92        -87.70    
NA                           41.92        -87.70
NA                           41.86        -87.63
ta52                           NA           NA
499                          41.9306      -87.7238  
255                          41.92        -87.7078
```
`{r}
终点站id终点站lng终点站
NA 41.92-87.70
NA 41.92-87.70
NA 41.86-87.63
TA52NA
499                          41.9306      -87.7238  
255                          41.92        -87.7078
```
因此,在上面的示例中,我想将前两个NAs替换为255,因为gps对匹配

我知道我必须不知怎么折腾,但我不知道

下一个复杂问题是,由于gps的记录方式可能不完全匹配,因为自行车被放在货架上,一些自行车记录的gps有效数字比其他自行车更好

因此,为了使匹配更容易,我想尝试找到每个站的平均lat/lng,以使匹配更容易,这是我的想法之一。因此,使用唯一的站点id和每个id的所有gps点的平均值创建一个新的DF。然后将这些平均值点替换回原始DF,以便只有709个站点gps点

我认为有足够的lat/lon点,只要扫描整个DF,数据集中的某个地方就会有一个精确的匹配

那么,如何执行lappy()或apply()来查看lat/lon上是否存在匹配,然后将匹配的桩号保存在df中呢

看起来我首先需要一个没有缺失ID的DF,这样我就可以过滤它来清理。然后,当我找到匹配项时,我会将固定行找到干净的DF

很抱歉,我只是还没有足够的关于apply(x,function)的R培训


所以,结束吧。我有一个缺少数据的df,可以通过比较其他列来填充缺少的数据来推断。

我担心你的第一个方法的准确性。将lat/long值四舍五入到两位小数并不能得到所需的匹配项,因为将桩号255的lon四舍五入到两位数字会得到-87.71,这与NA桩号lon(-87.70)不同

下面是第二种方法的一个实现,使用dplyr:

library(dplyr)

# Separate data into those with and without ids
df_clean <- df %>% filter(!is.na(end_station_id))
df_na <- df %>% filter(is.na(end_station_id))

# match stations to NAs based on lat/log
df_matched <- df_na %>%
  left_join(df_clean, 
            by = c("end_lat", "end_lng"), 
            suffix = c(".na", ".clean")) %>%
  mutate(end_station_id = end_station_id.clean) %>%
  select(-end_station_id.na, -end_station_id.clean)

# Recombine data
df_cleaned <- rbind(df_clean, df_matched)
库(dplyr)
#将数据分为带ID和不带ID的数据
df_清洁%过滤器(!is.na(结束站id))
df_na%过滤器(is.na(end_station_id))
#根据lat/log将站点与NAs匹配
df_匹配%
左连接(df_清洁,
by=c(“端面”、“端面lng”),
后缀=c(“.na”,“.clean”))%>%
突变(结束站id=结束站id.clean)%>%
选择(-end\U station\U id.na,-end\U station\U id.clean)
#重新组合数据

谢谢你@TEDDY。我要试试这个。关于舍入,我同意你的看法,我最初的方法是使用最小-最大值,但如何通过编程实现这一点在R和python中是我无法理解的。