【发布时间】: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”值?
【问题讨论】:
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”值?
【问题讨论】:
如果您知道要从中提取信息的级别,则可以使用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 的函数的想法。感谢@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 %>% flatten() %>% transpose() %>% pluck("t")
transpose:list_ex %>% flatten() %>% map("t")给你同样的结果
list_ex 而不是list,因为我认为将名称作为功能并不是一个好习惯。仅供您了解。
与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,您可以使用purrr 和map(list, ~map_dbl(.x, "t")) %>% flatten_dbl() 来获得类似的结果