如何解决如何在R中没有循环的情况下快速访问列表列表中的元素? Googleway 包
我正在使用 googleway
包,我有一堆地址需要解析嵌套列表列表中的地址的各个组成部分。循环(不鼓励)和应用函数看起来都令人困惑,我不确定是否有一个整洁的解决方案。我发现 map
函数(特别是它在后端列表上调用的 pluck
函数)可以实现我的目标,因此我将分享我的解决方案。
问题: 我需要提取有关白宫的某些信息,例如
- 纬度
- 经度
您需要使用 googleway::set_key(API_KEY)
设置您的 Google Cloud API 密钥,但这只是嵌套列表的一个示例,我希望使用此包的人会看到。
# Address for the White House and the Lincoln Memorial
address_vec <- c(
"1600 Pennsylvania Ave NW,Washington,DC 20006","2 Lincoln Memorial Cir NW,DC 20002"
)
address_vec <- pmap(list(address_vec),googleway::google_geocode)
[[1]]
[[1]]$results
address_components
1 1600,Pennsylvania Avenue northwest,northwest Washington,district of Columbia,United States,20500,1600,Pennsylvania Avenue NW,DC,US,street_number,route,neighborhood,political,locality,administrative_area_level_1,country,postal_code
formatted_address geometry.bounds.northeast.lat
1 1600 Pennsylvania Avenue NW,DC 20500,USA 38.8979
geometry.bounds.northeast.lng geometry.bounds.southwest.lat geometry.bounds.southwest.lng geometry.location.lat
1 -77.03551 38.89731 -77.03796 38.89766
geometry.location.lng geometry.location_type geometry.viewport.northeast.lat geometry.viewport.northeast.lng
1 -77.03657 ROOFTOP 38.89895 -77.03539
geometry.viewport.southwest.lat geometry.viewport.southwest.lng place_id
1 38.89626 -77.03808 ChIJGVtI4by3t4kRr51d_Qm_x58
types
1 establishment,point_of_interest,premise
[[1]]$status
[1] "OK"
[[2]]
[[2]]$results
address_components
1 2,Lincoln Memorial Circle northwest,Southwest Washington,20037,2,Lincoln Memorial Cir NW,postal_code
formatted_address geometry.location.lat geometry.location.lng
1 2 Lincoln Memorial Cir NW,DC 20037,USA 38.88927 -77.05018
geometry.location_type geometry.viewport.northeast.lat geometry.viewport.northeast.lng
1 ROOFTOP 38.89062 -77.04883
geometry.viewport.southwest.lat geometry.viewport.southwest.lng place_id
1 38.88792 -77.05152 ChIJgRuEham3t4kRFju4R6De__g
plus_code.compound_code plus_code.global_code types
1 VWQX+PW Washington,USA 87C4VWQX+PW street_address
[[2]]$status
[1] "OK"
解决方法
这是我从 Googleway Vignette 得到的一些代码:
df <- google_geocode(address = "Flinders Street Station",key = key,simplify = TRUE)
geocode_coordinates(df)
# lat lng
# 1 -37.81827 144.9671
看起来你需要做的是:
df <- google_geocode("1600 Pennsylvania Ave")
geocode_coordinates(df)
,
我想出的解决方案是一个自定义函数,它可以访问 list 的任何部分:
geocode_accessor <- function(df,accessor,...) {
unlist(map(df,list(accessor,...)))
}
这需要理解三个重要部分:
-
map
函数正在为我们调用pluck
函数(它取代了[[
的使用)。您可以阅读有关正在发生的事情的更多信息 here,但只要知道这可以让我们按名称访问内容 - 函数定义和列表中的“...”允许我们访问多个级别。同样,pluck 文档中解释了如何使用
list()
访问列表中的更多级别 - 使用 unlist 将列表转换为向量(在我的实例中是我想要的)
综合起来,我们可以得到白宫和林肯纪念堂的纬度:
geocode_accessor(address_vec,"results","geometry","location","lat")
[1] 38.89766 38.88927
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。