向数据框添加列以匹配地理坐标与位置名称
Add column to data frame to match geographic coordinates with location name
我有一个数据框 (df1),其中包含一家自行车共享公司的数百万行自行车骑行数据。共有17列,但我只对四列下的所有数据感兴趣。
- loc_id
- ride_type
- 纬度
- 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))
我有一个数据框 (df1),其中包含一家自行车共享公司的数百万行自行车骑行数据。共有17列,但我只对四列下的所有数据感兴趣。
- loc_id
- ride_type
- 纬度
- 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))