根据向量重叠从列表中删除元素并将元素添加到列表

时间:2019-05-07 17:40:52

标签: r list append subset

我有一个包含约500个模型对象的列表。该对象的名称为v1:

existing.list <- vector("list", 3)
v1 <- names(existing.list) <- c("A", "B", "C")

我现在得到不同的数据集,我也需要对其进行建模,并将其保存在同一列表中。新数据集中的对象与existing.list中的某些对象重叠。因为这非常耗时,所以我想保留旧的结果。此新数据集的名称为v2:

v2 <- c("B", "C", "D")

我首先要删除v1中的对象,而不是v2中的对象,然后将其附加到现存。列出v2中所有新的唯一名称。 我可以用相当复杂的方式完成第一个任务:

rm <- v1[!v1 %in% v2]
rm.i <- which(v1 %in% rm)
v1 <- v1[-rm.i]

但是后来我无法追加新对象,这取决于v2中的唯一元素:

new.elements <- v2[!v2 %in% v1]

所需的输出是经过修改的existing.list,具有完整的元素“ B”和“ C”以及新的空元素“ D”。基本上,它是一个列表,其中元素由v2中的名称确定,但是由于多种原因,仅创建一个新列表并将existing.list的一部分复制到其中会很复杂。 由于我需要对许多列表执行此操作,因此比我现在更简单的方法很方便。

非常感谢您!这是项目的最后一分钟,因此深表感谢!

这个问题基于previous question,我措辞太粗,造成了混乱。感谢那些仍在努力帮助我的用户。

2 个答案:

答案 0 :(得分:1)

这些是您要找的吗?

intersect(v1, v2)
# [1] "B" "C"

setdiff(v2, v1)
# [1] "D"

答案 1 :(得分:1)

如果我对您的理解正确,那么您可以首先获取v2中而不是v1中的元素的名称

tmp <- setdiff(v2, v1) # "D"

然后是子集existing.list并将其附加如下

existing.list <- c(existing.list[v1 %in% v2], 
                   setNames(vector("list", length(tmp)), tmp))

结果

existing.list
#$B
#NULL

#$C
#NULL

#$D
#NULL