【问题标题】:How to select elements with the same name from nested list with purrr?如何从带有 purrr 的嵌套列表中选择具有相同名称的元素?
【发布时间】:2017-09-08 20:19:53
【问题描述】:
require(purrr)

list <- list( 
  node = list(a = list(y = 1, t = 1), b = list(y = 1, t = 2)),
  node = list(a = list(y = 1, t = 3), b = list(y = 1, t = 4))) 

如何使用 purrr 选择所有“t”值?

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    如果您知道要从中提取信息的级别,则可以使用modify_depth

    您想为嵌套列表拉出t,这是第 2 级。

    modify_depth(list, 2, "t")
    
    $node
    $node$a
    [1] 1
    
    $node$b
    [1] 2
    
    
    $node
    $node$a
    [1] 3
    
    $node$b
    [1] 4
    

    purrrmodify 系列函数返回与输入相同类型的对象,因此您需要 unlist 来获取向量而不是列表。

    【讨论】:

    • 不错。这是base R 还是依赖包?
    • 这是来自 purrr
    【解决方案2】:

    这里有一些使用来自purrr 的函数的想法。感谢@cderv 的精彩建议。

    这是第一个。 pluck的用法与$类似。

    list %>% flatten() %>% transpose() %>% pluck("t")
    $a
    [1] 1
    
    $b
    [1] 2
    
    $a
    [1] 3
    
    $b
    [1] 4
    

    这是第二个。

    list %>% flatten() %>% map("t") 
    $a
    [1] 1
    
    $b
    [1] 2
    
    $a
    [1] 3
    
    $b
    [1] 4
    

    最后,如果我们想要一个向量,如果我们知道t 中的元素都是数字,我们可以使用map_dbl

    list %>% flatten() %>% map_dbl("t")
    a b a b 
    1 2 3 4
    

    【讨论】:

    • 要保持完整的purrr功能,您可以使用pluck而不是`$`()list_ex %&gt;% flatten() %&gt;% transpose() %&gt;% pluck("t")
    • 你可以做得更简洁,因为你不需要transposelist_ex %&gt;% flatten() %&gt;% map("t")给你同样的结果
    • @cderv 谢谢。我会根据您的建议更新我的答案。
    • 酷!我使用list_ex 而不是list,因为我认为将名称作为功能并不是一个好习惯。仅供您了解。
    • 感谢您在回答中的参考!很高兴我能帮上忙。
    【解决方案3】:

    purrr::map

    map(list, ~map(.x, ~.x$t))
    

    输出仍然是列表列表

    $node
    $node$a
    [1] 1
    
    $node$b
    [1] 2
    
    
    $node
    $node$a
    [1] 3
    
    $node$b
    [1] 4
    
    unlist
    

    转成矢量

    unlist(map(list, ~map(.x, ~.x$t)))
    

    输出

    node.a node.b node.a node.b 
         1      2      3      4     
    

    【讨论】:

    • map(.x, ~.x$t)可以直接写map(.x, "t")。你不需要匿名函数。如果.f 是数字或字符,则它充当提取器功能。
    • 而不是unlist,您可以使用purrrmap(list, ~map_dbl(.x, "t")) %&gt;% flatten_dbl() 来获得类似的结果
    猜你喜欢
    • 2020-07-08
    • 2023-03-12
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多