我有两个列表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中执行此操作?
4条答案
按热度按时间58wvjzkj1#
在这种情况下,您可以:
以致
3df52oht2#
这不是特别优雅,但是你可以用一个循环来完成,这个循环遍历
x
中的元素,在x
中的元素,如果x
中有一个元素和y
中的元素同名,这两个元素在z
中连接在一起,否则,z
只是x
,根据真实的问题的规模,这可能太慢了,也许有人可以提供一个整洁的替代方案。hl0ma9xz3#
使用
map_if
的替代解决方案:将list_merge
应用于原始列表中至少有一个与y
相同的子名称的每个元素: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]正确