【问题标题】:Using map and pluck to get values from nested list使用 map 和 pluck 从嵌套列表中获取值
【发布时间】:2020-03-29 17:27:25
【问题描述】:

我有以下讨厌的嵌套列表

编辑:更新为包含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_wants

我知道我可以在 for 循环中使用以下代码

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

但我想提高我的地图技能。我了解当列表是单级时如何使用map_chr,但我没有找到很多关于从非常嵌套的列表中提取的资源。我也知道我可以使用[[,但还没有找到合适的文档?

任何帮助表示赞赏!

【问题讨论】:

    标签: r purrr pluck


    【解决方案1】:

    如果我们需要'yay's

    library(purrr)
    library(dplyr)
    map(mylist, ~ .x$nested_1$nested_2 %>% unlist%>% grep("^yay", ., value = TRUE))
    

    或者在用map循环遍历list之后,使用pluck提取基于键'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。我会更新我的问题以反映这一点
    • 再次感谢您的帮助 - 我想避免使用 grep,因为在我的真实数据中,这些值实际上是完全不同的。感谢您帮助我查明我的问题 - 很抱歉造成混乱!
    • @MayaGans 和 pluck 我们只得到那些具有键 'value_I_want' 的元素
    【解决方案2】:

    一个更通用的解决方案,只需要我们知道所需值的嵌套深度:

    map(mylist, ~pluck(.,1,1) %>% map(pluck, "value_I_want")) 
    

    第二个 pluck 在第一个 pluck 设置的嵌套级别上运行。

    这也适用于缺少中间名的嵌套列表,这在从互联网提取的 JSON 数据中经常发现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 2014-08-27
      相关资源
      最近更新 更多