向数据框添加列以匹配地理坐标与位置名称

Add column to data frame to match geographic coordinates with location name

我有一个数据框 (df1),其中包含一家自行车共享公司的数百万行自行车骑行数据。共有17列,但我只对四列下的所有数据感兴趣。

  1. loc_id
  2. ride_type
  3. 纬度
  4. lng

df1 上的每个位置 ID 都有一个匹配的纬度 (lat) 和经度 (lng),显示在其各自的列中。因此,每次在 loc_id 列下重复观察时,lat 和 lng 下的匹配观察也会重复。

当我 运行 以下脚本时,lat 和 lng 不会出现在生成的新的较小数据框 (df2) 中。

df2 <- df1 %>%
  count(loc_id, ride_type)

这是输出的前六行:

            loc_id      ride_type    n
1            13001        casual   14109
2            13001        member   11769
3            13006        casual    3459
4            13006        member    7164
5            13008        casual   33316
6            13008        member    8971

不过,我希望输出遵循以下模式。我该怎么做?

            loc_id      ride_type   n        lat         lng
1            13001        casual   14109   41.88398   -87.62468
2            13001        member   11769   41.88398   -87.62468
3            13006        casual    3459   41.77937   -87.66484
4            13006        member    7164   41.77937   -87.66484
5            13008        casual   33316   41.80594   -87.59247
6            13008        member    8971   41.80594   -87.59247

df2 是为了总结 df1,使每个 loc_id 只出现两次:一次显示从那里开始的休闲游乐设施的数量,再次显示从那里开始的会员游乐设施的数量。

我运行以下:

df2 %>%
  left_join(select(df1, c(loc_id, lat, lng)), by = c("loc_id" = "loc_id"))

这对我不起作用,因为它将 df1 中的所有行添加到 df2。以下输出是连接产生的 df2 的前 10 行。

              loc_id   member_casual    n       lat     lng
1              13001        casual    14109  41.88398 -87.62468
2              13001        casual    14109  41.88398 -87.62468
3              13001        casual    14109  41.88381 -87.62401
4              13001        casual    14109  41.88398 -87.62468
5              13001        casual    14109  41.88398 -87.62468
6              13001        casual    14109  41.88398 -87.62468
7              13001        casual    14109  41.88377 -87.62445
8              13001        casual    14109  41.88403 -87.62416
9              13001        casual    14109  41.88398 -87.62468
10             13001        casual    14109  41.88398 -87.62468

这不是我想要的。我是否应该尝试 R 使用的任何与 Excel 的 VLOOKUP 等效的东西,而不是连接?无论哪种方式,最简单的方法是什么?感谢您提供的任何帮助!

您可以在连接命令中包含列选择,以将两个数据框合并在一起。

df2 %>% 
  left_join(select(df1, c(loc_id, lat, lng), by = c("loc_id" = "loc_id"))

从技术上讲,您不需要连接语句的 by 部分,因为两个数据框具有相同的列名,但它更明确地说明了您要连接的内容。

编辑 --------------------

从您提供的结果片段看来,每个 loc_id 都有多个唯一的纬度和经度值,这就是为什么要连接这么多行的原因。

如果每个 loc_id 的纬度和经度值都大致相似并且没有提供信息,那么您可以使用 distinct() 函数保留每个分组的前两行。

df2 %>% 
  left_join(select(df1, c(loc_id, lat, lng), by = c("loc_id" = "loc_id")) %>% 
  distinct(loc_id, lat, lng, .keep_all = TRUE)

或者如果您不需要每个 loc_id 的纬度和经度的精度很高,您可以使用 round() 函数来减少每个纬度和经度的小数位数在合并之前在您的 df1 数据框中。这将减少将要连接的唯一值的数量。

或者,我相信这也可能会引发其他问题,但如果你的观点都非常接近,你可以尝试对每个 loc_id 取纬度和经度的平均值。

df2 %>% 
  left_join(select(df1, c(loc_id, lat, lng), by = c("loc_id" = "loc_id")) %>% 
  group_by(loc_id, member_casual, n) %>% 
  summarise(lat = mean(lat), lng = mean(lng))