在R中使用覆盖连接列表

时间:2015-03-05 10:08:06

标签: r

如何在R中连接两个列表,使第二个中的重复元素覆盖第一个中的相应元素?

我尝试了c(),但它保留了重复:

l1 <- list(a = 1, b = 2)
l1 <- c(l1, list(b = 3, c = 4))

# $a
# [1] 1
# 
# $b
# [1] 2
# 
# $b
# [1] 3
#
# $c
# [1] 4

我想要一些会产生这种效果的东西:

# $a
# [1] 1
# 
# $b
# [1] 3
#
# $c
# [1] 4

希望存在比调用某些* apply函数更简单的东西吗?

4 个答案:

答案 0 :(得分:5)

这适用于duplicated

> l1[!duplicated(names(l1), fromLast=TRUE)]
$a
[1] 1

$b
[1] 3

$c
[1] 4

答案 1 :(得分:4)

我怀疑你可以通过使用&#34; rlist&#34;来获得你想要的行为。包;具体而言,list.merge似乎可以满足您的需求:

l1 <- list(a = 1, b = 2)
l2 <- list(b = 3, c = 4)
library(rlist)
list.merge(l1, l2)
# $a
# [1] 1
# 
# $b
# [1] 3
# 
# $c
# [1] 4 

尝试使用list.merge(l2, l1)来了解功能的行为。


如果只有两个列表,如@PeterDee所述,list.merge函数几乎使modifyList接受两个以上的列表。因此,对于此特定示例,您可以跳过加载任何包并直接执行:

modifyList(l1, l2)

答案 2 :(得分:1)

我确信有一种比以下更快的方式:

l1 <- list(a = 1, b = 2)
l2 <- list(b = 3, c = 4)

l1 <- c(l1[!(names(l1) %in% names(l2))],  l2)

您获取l1中不在l2的名称并连接两个列表

答案 3 :(得分:0)

我建议union

l1 <- list(a = 1, b = 3)
l2 <- list(b = 3, c = 4)

union(l1, l2)

这就像数学联盟(Wiki link