如何使用purrr从嵌套列表中选择具有相同名称的元素?

时间:2017-09-08 20:19:54

标签: r purrr

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”值?

3 个答案:

答案 0 :(得分:4)

如果您知道要从中提取信息的级别,可以使用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

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

答案 1 :(得分:3)

以下是使用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

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

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

答案 2 :(得分:1)

使用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