加入两个命名列表,如果重复则保留.x

时间:2019-05-06 18:54:11

标签: r purrr

我想将两个命名列表listAlistB加入/追加/合并/合并到一个列表(listComplete)中。如果element在两个列表中,则保留一个,然后丢弃另一个。

listA = list(a = 'a', b = 'b')
listB = list(a = 'a_FromListB', c = 'c') 

然后我要加入/合并这两个对象

listComplete = list(a = 'a_FromListB', b = 'b', c = 'c')

我尝试使用c,但这会重复所有元素。我已经读到base::append只是c的包装,由于某种原因,我在purrr::append上遇到错误(名称空间中不存在-我使用的是purrr 0.3.2)。我也尝试过purrr::list_modify,但这对listB中元素a的“嵌套” listA

purrr::list_modify(listA, listB )
$a
$a$a
[1] "a_FromB"

$a$c
[1] "c"


$b
[1] "b"

重要的是

  • 仅保留a中的元素listB
  • 不是嵌套列表,
  • 保留所有其他(不相交)元素。

一个好处是对新列表进行排序,使它以listA开头(其中listB中的所有元素也都替换为listB中的值),然后是{{1} }。

我知道我可以编写自己的函数,但这似乎应该是开箱即用的-特别是在listB中。

2 个答案:

答案 0 :(得分:0)

我们可以在两个duplicated的级联names上使用list,然后用它来过滤级联lists中的元素

c(listA, listB)[!duplicated(c(names(listA), names(listB)), fromLast = TRUE)]

答案 1 :(得分:0)

这是另一种方式:

c(listA,`[<-`(listB, names(listA), value = NULL))
#> $a
#> [1] "a"
#> 
#> $b
#> [1] "b"
#> 
#> $c
#> [1] "c"