如何使用purrr在R中的深度嵌套列表列中提取属性?

如何使用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,“几何体”,“位置”

我使用谷歌地理编码API请求数千个地址的位置数据。每个请求的内容都被解析为一个列表。结果列表添加在“get_response”列下

我在使用purrr包从这些列表中提取个人属性时遇到了很大的困难,我希望你们这些优秀的人能够提供帮助

库(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