我的数据帧在end_station_id中缺少一些数据。它被正确地读取为csv文件(3489749行(,其中147242行作为NA 丢失数据
我想通过使用已知end_station_id 的结束纬度/经度对查找匹配项来填充缺失的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
```
所以在上面的例子中,我想用255替换前两个NA,因为gps对匹配。
我知道我必须以某种方式撒谎,但我一无所知。
下一个复杂的情况是,因为gps的记录方式可能不完全匹配,因为自行车被放在货架上,有些自行车的gps有效数字比其他自行车更好。
因此,为了使匹配更容易,我一直在考虑尝试找到每个站点的平均lat/lng,以使匹配更简单,这是我的一个想法。因此,用唯一的站id和每个id的所有gps点的平均值创建一个新的DF。然后将这些平均点替换回原始DF,这样就只有709个站gps点。
或
我认为有足够的lat/lon点,只要扫描整个DF,数据集中的某个地方就应该有一个精确的匹配。
那么,我该如何执行lapply((或apply((来查看lat/lon上是否存在匹配,然后将匹配的站id保存在df中呢?
看起来我首先需要一个没有丢失ID的DF,这样我就可以过滤掉它进行清洁。然后,当我找到匹配项时,我将固定行绑定到干净的DF
对不起,我只是还没有足够的R训练应用(x,函数(,如果这有帮助的话。
所以,结束吧。我有一个缺失数据的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)
也许在加入之前对值进行四舍五入会让你更好地匹配。
另一种(更好的?/更多涉及的(方法是为每个测站定义最小和最大允许值,然后根据这些范围内的值分配测站。或者找到距离最小的车站。