如何将第二个列表中的元素添加到R中第一个列表中的现有元素

tmb3ates  于 2023-01-28  发布在  其他
关注(0)|答案(4)|浏览(170)

我有两个列表x和y:

x <- list(id1 = list(a = list(t = 5)), id2 = list(a = list(t = 1), b = list(t = 3)), id3 = list(a = list(t = 1), b = list(t = 2)))

y <- list(b = list(k = 7))

我需要修改x list,在y list中添加相应的“B”元素,得到z list:

z <- list(id1 = list(a = list(t = 5)), id2 = list(a = list(t = 1), b = list(t = 3, k = 7)),
  id3 = list(a = list(t = 1), b = list(t = 2, k = 7)))

我尝试使用purrr包中的list_modify(x, y)list_merge(x, !!!y),但是得到了错误的结果。如何在R中执行此操作?

58wvjzkj

58wvjzkj1#

在这种情况下,您可以:

result <- lapply(x, function(i) {
  if("b" %in% names(i)) i$b <- append(i$b, y$b); i;
  })

以致

identical(result, z)
#> [1] TRUE
3df52oht

3df52oht2#

这不是特别优雅,但是你可以用一个循环来完成,这个循环遍历x中的元素,在x中的元素,如果x中有一个元素和y中的元素同名,这两个元素在z中连接在一起,否则,z只是x,根据真实的问题的规模,这可能太慢了,也许有人可以提供一个整洁的替代方案。

z <- vector(mode="list", length = length(x))  
for(i in 1:length(x)){
  for(j in 1:length(y)){
    z[[i]] <- x[[i]]
    if(names(y)[j] %in% names(x[[i]])){
      z[[i]][[names(y)[j]]] <- c(x[[i]][[names(y)[j]]], y[[j]])
    }else{
      
    }
    names(z) <- names(x)
  }
}
hl0ma9xz

hl0ma9xz3#

使用map_if的替代解决方案:将list_merge应用于原始列表中至少有一个与y相同的子名称的每个元素:

map_if(x, ~any(names(.) %in% names(y)), list_merge, !!!y)
6qqygrtg

6qqygrtg4#

purrr::list_merge按预期工作,但是当列表被命名时,它使用名称来查找要合并的位置,并且您的y没有正确地使用id 2/id 3来命名,因此无法进行合并。
要使用list_merge:
y <- list(id2 = list(b = list(k = 7)), id3 = list(b = list(k = 7)))
z2 <- list_merge(x, !!!y)
identical(z, z2)
[1]正确

相关问题