合并R中的两个列表

Mic*_*ael 71 r list dataframe

我有两个清单

first = list(a = 1, b = 2, c = 3)
second = list(a = 2, b = 3, c = 4)
Run Code Online (Sandbox Code Playgroud)

我想合并这两个列表,以便最终产品

$a
[1] 1 2

$b
[1] 2 3

$c
[1] 3 4
Run Code Online (Sandbox Code Playgroud)

有这么简单的功能吗?

And*_*rei 101

如果列表总是具有相同的结构,如示例中那么,则更简单的解决方案是

mapply(c, first, second, SIMPLIFY=FALSE)
Run Code Online (Sandbox Code Playgroud)

  • 这相当于`Map(c,first,second)`,如果有人关心的话. (26认同)
  • 我只是在学习R,为什么Map(和mapply)有'c'作为第一个参数?传入的参数不应该只是两个列表吗? (2认同)
  • 'c'是创建列表的基本函数的名称.在R中键入c而没有尾随的parens显示'function(...,recursive = FALSE).Primitive("c")'所以这个陈词滥调是将'c'函数映射到第一个和第二个的内容. (2认同)
  • @Masterfool mapply()更有效率,因为`Map()`包含`mapply()` (2认同)

42-*_*42- 23

这是Sarkar对modifyList函数的一个非常简单的改编.因为它是递归的,它将处理比复杂情况更复杂的情况mapply,并且它将通过忽略'first'中不在'first'中的项来处理不匹配的名称情况.

appendList <- function (x, val) 
{
    stopifnot(is.list(x), is.list(val))
    xnames <- names(x)
    for (v in names(val)) {
        x[[v]] <- if (v %in% xnames && is.list(x[[v]]) && is.list(val[[v]])) 
            appendList(x[[v]], val[[v]])
        else c(x[[v]], val[[v]])
    }
    x
}

> appendList(first,second)
$a
[1] 1 2

$b
[1] 2 3

$c
[1] 3 4
Run Code Online (Sandbox Code Playgroud)


Aar*_*ica 12

这里有两个选项,第一个:

both <- list(first, second)
n <- unique(unlist(lapply(both, names)))
names(n) <- n
lapply(n, function(ni) unlist(lapply(both, `[[`, ni)))
Run Code Online (Sandbox Code Playgroud)

第二个,只有它们具有相同的结构才有效:

apply(cbind(first, second),1,function(x) unname(unlist(x)))
Run Code Online (Sandbox Code Playgroud)

两者都给出了期望的结果.