假设有一个如下列表:
x <- list(a = list(a1 = 1, a2 = 2), b = list(a2 = 3, a1 = 4))
职位/名称混在子列表中,要从列表中抽出a1
,我将在purrr
中执行以下操作。
x %>% map(purrr::pluck, "a1")
$`a`
[1] 1
$b
[1] 4
要扔掉一个元素而不是保留它,我做了一些实验,并提出了以下建议(我在这里扔掉了a2
)。
x %>% map(purrr::assign_in, "a2", value = NULL)
$`a`
$`a`$`a1`
[1] 1
$b
$b$`a1`
[1] 4
在摘录方面,我实际上更喜欢第二种样式-也就是说,保持列表索引结构不变,同时仅返回我想要的元素。因此,我希望执行x %>% map(purrr::pluck, "a1")
后,我得到第二个结果。
或者,也许还有一种我不知道的将对象扔出purrr
的更好的方法,这样两个代码的输出样式(拔出,扔掉)会保持一致吗?
答案 0 :(得分:2)
如果我们需要一致的方法,请使用keep
library(purrr)
map(x, ~ keep(.x, names(.x) == "a1"))
#$a
#$a$a1
#[1] 1
#$b
#$b$a1
#[1] 4
和discard
map(x, ~ discard(.x, names(.x) == "a1"))
#$a
#$a$a2
#[1] 2
#$b
#$b$a2
#[1] 3
答案 1 :(得分:0)
这是使用modify_at
的另一种方法,并提出了一种更惯用的方式进行首次呼叫:
library(purrr)
#> Warning: package 'purrr' was built under R version 3.5.3
x <- list(a = list(a1 = 1, a2 = 2), b = list(a2 = 3, a1 = 4))
# rather than x %>% map(purrr::pluck, "a1")
x %>% map("a1")
#> $a
#> [1] 1
#>
#> $b
#> [1] 4
x %>% modify(modify_at,"a2", ~NULL)
#> $a
#> $a$a1
#> [1] 1
#>
#>
#> $b
#> $b$a1
#> [1] 4
由reprex package(v0.2.1)于2019-05-05创建