如何使用purrr在R中的深度嵌套列表列中提取属性?
我使用谷歌地理编码API请求数千个地址的位置数据。每个请求的内容都被解析为一个列表。结果列表添加在“get_response”列下 我在使用purrr包从这些列表中提取个人属性时遇到了很大的困难,我希望你们这些优秀的人能够提供帮助如何使用purrr在R中的深度嵌套列表列中提取属性?,r,tidyverse,purrr,R,Tidyverse,Purrr,我使用谷歌地理编码API请求数千个地址的位置数据。每个请求的内容都被解析为一个列表。结果列表添加在“get_response”列下 我在使用purrr包从这些列表中提取个人属性时遇到了很大的困难,我希望你们这些优秀的人能够提供帮助 库(tidyverse) #>警告:程序包“tidyverse”是在R版本3.5.3下构建的 l1 #>1第一个位置 #>2第二个位置 下面我将演示如何一次提取一个属性: pulk(开始_df[1,]$get_response,1,“结果”,1,“几何体”,“位置”
库(tidyverse)
#>警告:程序包“tidyverse”是在R版本3.5.3下构建的
l1
#>1第一个位置
#>2第二个位置
下面我将演示如何一次提取一个属性:
pulk(开始_df[1,]$get_response,1,“结果”,1,“几何体”,“位置”,“纬度”)
#> [1] 41.9
拔毛(开始测向[2,]$get_响应,1,“结果”,1,“几何体”,“位置”,“纬度”)
#> [1] 35.1
这是我想要的输出:
所需的_输出#一个tible:2 x 3
#>名称获取响应lat
#>
#>1第一单元位置41.9
#>2第二个位置35.1
这是我尝试使用purrr::map的过程
new_df错误:无法将NULL转换为函数
由(v0.3.0)于2020年4月18日创建
有人知道这样做的好方法吗?您可以使用
purr
中的map\u dbl
,并使用公式格式应用您的拔毛:
starting_df %>%
mutate(lat=map_dbl(get_response,~pluck(.x,"results",1,"geometry","location","lat")))
# A tibble: 2 x 3
name get_response lat
<chr> <list> <dbl>
1 first_location <named list [2]> 41.9
2 second_location <named list [2]> 35.1
启动\u df%>%
变异(lat=map\u dbl(获取响应,~pull(.x,“结果”,1,“几何体”,“位置”,“lat”))
#一个tibble:2x3
名称获取响应lat
1第一单元位置41.9
2第二个位置35.1
我们可以从purr
library(dplyr)
library(purrr)
starting_df %>%
mutate(lat = map_dbl(get_response, ~ pluck(.x, 1, 1,
'geometry', 'location', 'lat', .default = NA_real_),
.default = NA_real_))
# A tibble: 2 x 3
# name get_response lat
# <chr> <list> <dbl>
#1 first_location <named list [2]> 41.9
#2 second_location <named list [2]> 35.1
谢谢两种选择都有效。我确实想指出,我的数据中有一些响应没有“lat”值,因此使用map_dbl是不起作用的。相反,我使用了map,然后将值分别转换为double。@Thomasteiner如果没有任何值,请使用
。default=NA\u real\u
l3 <- list(results = list(list(geometry =
list(location = list( lng = -70.6)))), status = "OK")
starting_df <- tribble(~name, ~get_response,
"first_location", l1,
"second_location", l2,
"third_location", l3)
starting_df %>%
mutate(lat = map_dbl(get_response, ~ pluck(.x, 1, 1,
'geometry', 'location', 'lat', .default = NA_real_),
.default = NA_real_))
# A tibble: 3 x 3
# name get_response lat
# <chr> <list> <dbl>
#1 first_location <named list [2]> 41.9
#2 second_location <named list [2]> 35.1
#3 third_location <named list [2]> NA
starting_df %>%
rowwise %>%
mutate(lat = pluck(get_response, 1, 1, 'geometry', 'location', 'lat'))
# A tibble: 2 x 3
# Rowwise:
# name get_response lat
# <chr> <list> <dbl>
#1 first_location <named list [2]> 41.9
#2 second_location <named list [2]> 35.1