【问题标题】:Join two named lists, keep .x if duplicate加入两个命名列表,如果重复则保留 .x
【发布时间】:2019-05-06 18:54:10
【问题描述】:

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

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,但是这个“嵌套”listBlistA 中的元素 a

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

$a$c
[1] "c"


$b
[1] "b"

这很重要

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

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

我知道我可以编写自己的函数,但这似乎是开箱即用的东西——尤其是来自purrr

【问题讨论】:

  • 你需要c(listA, listB)[!duplicated(c(names(listA), names(listB)), fromLast = TRUE)]
  • 啊!谢谢!我不知道duplicated( , fromLast)。不错!!

标签: r purrr


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是另一种方式:

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

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多