我有两个列表,它们的元素有部分重叠的名称,我需要将它们合并/合并到一个列表中,逐个元素:
我的问题与Combine/merge lists by elements names有关,但我的示例中的数据结构更复杂,因此,在上述链接下提供的解决方案在这种情况下不起作用。
下面是一个简单的玩具例子:
l.1 <- list(list(c(10,20), NULL),list(c(10,20,30), NULL), list(c(9,12,13), NULL))
names(l.1) <- c("a","b","c")
l.2 <- list(list(NULL,c(1,0)),list(NULL,c(1,2,3)))
names(l.2) <- c("a","b")
因此,数据是“列表中的列表”类型,看起来像这样:
# > l.1
# $a
# $a[[1]]
# [1] 10 20
# $a[[2]]
# NULL
#
# $b
# $b[[1]]
# [1] 10 20 30
# $b[[2]]
# NULL
#
# $c
# $c[[1]]
# [1] 9 12 13
# $c[[2]]
# NULL
#
# > l.2
# $a
# $a[[1]]
# NULL
# $a[[2]]
# [1] 1 0
#
# $b
# $b[[1]]
# NULL
# $b[[2]]
# [1] 1 2 3
合并两个列表的结果应该如下:
# $a
# $a[[1]]
# [1] 10 20
# $a[[2]]
# [1] 1 0
#
# $b
# $b[[1]]
# [1] 10 20 30
# $b[[2]]
# [1] 1 2 3
#
# $c
# $c[[1]]
# [1] 9 12 13
# $c[[2]]
# NULL
我已经采用了Combine/merge lists by elements names中给出的解决方案,但这似乎不适用于这种数据结构。
以下是我尝试的:
l <- list(l.1, l.2)
keys <- unique(unlist(lapply(l, names)))
do.call(mapply, c(FUN=c, lapply(l, `[`, keys)))
我很感激任何帮助。
5条答案
按热度按时间aamkag611#
受josilber答案的启发,这里我们没有硬编码子列表的长度,而是使用
lapply
在结果中创建它们:nqwrtyyt2#
你可以使用
lapply
操作键来完成这个合并:hvvq6cgz3#
在这里,你可以在3行:
zsohkypk4#
这是一种嵌套的合并函数,它似乎可以产生您想要的输出。我觉得应该有一个更简单的方法,但我想不出一个。它将优先使用第一个参数中的值,但如果存在匹配的名称或索引,则将与第二个参数中的值合并。
nnt7mjpx5#
这是一个额外的解决方案。它使用
mapply
和c
合并列表:我从找到的on this SO question on merging two lists和this R help question on how to delete null elements in a list的答案中改编了这个答案。
第一行收集存在于两个列表中的至少一个列表中的名称(即所有可能的名字)。第二行使用
mapply
、c
和带有先前收集的名称的列表索引来合并列表,尽管存在额外的NULL
条目。第三行删除了这些NULL
条目,同时保留了列表名称。注意这个答案确实去掉了列表元素
c
的NULL
条目。