如何在R中的嵌套列表中获取元素的并集

sun*_*lsu 5 r

我在 say 中有一个嵌套列表lst(所有元素都是 class int)。我不知道lst提前的长度;但是我知道每个元素lst都是一个长度列表说k

length(lst[[i]]) # this equals k and is known in advance, 
                 # this is true for i = 1 ... length(lst)
Run Code Online (Sandbox Code Playgroud)

我如何取union第一个元素,第二个元素,...,所有元素的第 k 个元素lst

具体来说,如果 的长度lstn,我想要(不是 R 代码):

# I know that union can only be taken for 2 elements, 
# following is for illustration purposes
listUnion1 <- union(lst[[1, 1]], lst[[2, 1]], ..., lst[[n, 1]])
listUnion2 <- union(lst[[1, 2]], lst[[2, 2]], ..., lst[[n, 2]])
.
.
.
listUnionk <- union(lst[[1, k]], lst[[2, k]], ..., lst[[n, k]])
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助或指示。

这是一个可以使用的数据集,n = 3 和 k = 2

list(structure(list(a = 1:5, b = 6:11), .Names = c("a", "b")), 
    structure(list(a = 6:11, b = 1:5), .Names = c("a", "b")), 
    structure(list(a = 12, b = 12), .Names = c("a", "b")))
Run Code Online (Sandbox Code Playgroud)

Rei*_*son 5

这是一个通用的解决方案,其精神类似于@Ramnath,但避免使用union()它是一个二进制函数。诀窍是要注意它的union()实现方式是:

unique(c(as.vector(x), as.vector(y)))
Run Code Online (Sandbox Code Playgroud)

而里面的位unique()可以通过取消列出每个列表的第 th 个组件来实现n

那么完整的解决方案是:

unionFun <- function(n, obj) {
    unique(unlist(lapply(obj, `[[`, n)))
}
lapply(seq_along(lst[[1]]), FUN = unionFun, obj = lst)
Run Code Online (Sandbox Code Playgroud)

这使:

[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12

[[2]]
 [1]  6  7  8  9 10 11  1  2  3  4  5 12
Run Code Online (Sandbox Code Playgroud)

根据你展示的数据。

它的一些有用的功能是:

  • 我们使用中的`[[`子集。这与@Ramnath 的回答类似。但是,我们不需要匿名函数(我们使用匿名函数代替)。相当于@Ramnath 的答案是:objunionFunfunction(x) x$a`[[`lapply(lst, `[[`, 1)
  • 为了概括上述内容,我们将1上面的内容替换为nin unionFun(),并允许我们的列表作为 argument 传入obj

现在我们有了一个函数,可以提供给n定列表中第 th 个元素的并集,我们可以lapply()通过索引k,将 our 应用于unionFun()的每个子元素,利用 的长度与所有 的长度相同的lst事实。lst[[1]]length(lst[[k]])k

n如果返回对象中第 th 个元素的名称有帮助,我们可以这样做:

> unions <- lapply(seq_along(lst[[1]]), FUN = unionFun, obj = lst)
> names(unions) <- names(lst[[1]])
> unions
$a
 [1]  1  2  3  4  5  6  7  8  9 10 11 12

$b
 [1]  6  7  8  9 10 11  1  2  3  4  5 12
Run Code Online (Sandbox Code Playgroud)