purrr与pluck相反(丢弃元素)+在pluck中保留列表结构

时间:2019-05-05 00:28:40

标签: r indexing purrr

假设有一个如下列表:

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的更好的方法,这样两个代码的输出样式(拔出,扔掉)会保持一致吗?

2 个答案:

答案 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创建