使用map和pluck从嵌套列表中获取值

6

我有一个非常复杂的嵌套列表

编辑:更新,包括value_I_dont_want

mylist <- list(
  list(
    nested_1 = list(
      nested_2 = list(
        list( value_I_want = "a", value_I_dont_want = "f"),
        list( value_I_want = "b", value_I_dont_want = "g")
      )
    )
  ),
  list(
    nested_1 = list(
      nested_2 = list(
        list( value_I_want = "c", value_I_dont_want = "h"),
        list( value_I_want = "d", value_I_dont_want = "i"),
        list( value_I_want = "e", value_I_dont_want = "j")
      )
    )
  )
)

我希望获得所有我想要的 value_I_want

我知道我可以在一个 for 循环内使用以下代码

mylist[[x]]$nested_1$nested_2[[y]]$value_I_want

但我希望提高我的地图技能。我知道如何在列表为单层时使用 map_chr,但我没有找到很多关于从非常嵌套的列表中获取元素的资源。我也知道我可以使用[[,但没有找到合适的文档说明什么情况下使用。

非常感谢任何帮助!

2个回答

4
如果我们需要“yay”,
library(purrr)
library(dplyr)
map(mylist, ~ .x$nested_1$nested_2 %>% unlist%>% grep("^yay", ., value = TRUE))

或者使用 pluck 在使用 map 循环列表后,根据关键字“value_I_want”提取元素。

map(mylist, ~ .x$nested_1$nested_2 %>% 
                     map(pluck, "value_I_want") )

啊哈!谢谢你!这非常有帮助,但我在我的最小示例中没有包含的是未命名列表list(value_I_want = "yay_1", value_I_dont_want = "no")中还有其他元素,所以我不能只使用unlist。我会更新我的问题以反映这一点。 - MayaGans
非常感谢您的帮助 - 我想避免使用grep,因为在我的真实数据中,值实际上是非常不同的。感谢您帮助我找出问题所在 - 对于造成的混乱非常抱歉! - MayaGans
1
@MayaGans 使用 pluck 我们只获取那些具有键 'value_I_want' 的元素。 - akrun

2
一个更通用的解决方案,只需要我们知道所需值嵌套的深度:
map(mylist, ~pluck(.,1,1) %>% map(pluck, "value_I_want")) 

第二个pluck操作的嵌套级别由第一个pluck设置。
这也可以用于缺少中间名称的嵌套列表,通常在从互联网拉取的JSON数据中找到。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接