我在 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
具体来说,如果 的长度lst是n,我想要(不是 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)
这是一个通用的解决方案,其精神类似于@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)