假设我有两个列表:
list.a <- as.list(c("a", "b", "c"))
list.b <- as.list(c("d", "e", "f"))
我想递归地组合这些列表,这样结果将是一个组合元素的列表,作为一个向量,如下所示:
[[1]]
[1] a d
[[2]]
[1] a e
[[3]]
[1] a f
[[4]]
[1] b d
等等。我觉得我在这里错过了一些相对简单的东西。有什么帮助吗?
干杯。
假设我有两个列表:
list.a <- as.list(c("a", "b", "c"))
list.b <- as.list(c("d", "e", "f"))
我想递归地组合这些列表,这样结果将是一个组合元素的列表,作为一个向量,如下所示:
[[1]]
[1] a d
[[2]]
[1] a e
[[3]]
[1] a f
[[4]]
[1] b d
等等。我觉得我在这里错过了一些相对简单的东西。有什么帮助吗?
干杯。
expand.grid(list.a, list.b)
在 a 中为您提供所需的结果data.frame
。这往往是在 R 中处理数据最有用的格式。但是,您可以通过调用apply
and获得您要求的确切结构(保存排序) lapply
:
result.df <- expand.grid(list.a, list.b)
result.list <- lapply(apply(result.df, 1, identity), unlist)
如果您希望此列表按第一个元素排序:
result.list <- result.list[order(sapply(result.list, head, 1))]
您想要mapply
(如果“递归”是指“并行”):
mapply(c, list.a, list.b, SIMPLIFY=FALSE)
或者,这可能是您想要的更多:
unlist(lapply(list.a, function(a) lapply(list.b, function (b) c(a, b))), recursive=FALSE)
很惊讶没有人提到这个简单的单行:
as.list(outer(list.a,list.b, paste))
[[1]]
[1] "a d"
[[2]]
[1] "b d"
[[3]]
[1] "c d"
[[4]]
[1] "a e"
这会让你得到你正在寻找的东西:
unlist(lapply(list.a, function(X) {
lapply(list.b, function(Y) {
c(X, Y)
})
}), recursive=FALSE)
这是一个您可以将列表传递给以展开的函数
expand.list <- function(...){
lapply(as.data.frame(t((expand.grid(...)))),c, recursive = TRUE, use.names = FALSE)}
expand.list(list.a, list.b)
这是一种有点蛮力的方法,考虑到它们是相同的维度,使用 append 函数递归地将 list.b 附加到 list.a。
# CREATE LIST OBJECTS
list.a <- as.list(c("a", "b", "c"))
list.b <- as.list(c("d", "e", "f"))
# CREATE AN EMPTY LIST TO POPULATE
list.ab <- list()
# DOUBLE LOOP TO CREATE RECURSIVE COMBINATIONS USING append
ct=0
for( i in 1:length(list.a) ) {
for (j in 1:length(list.b) ) {
ct=ct+1
list.ab[[ct]] <- append(list.a[[i]], list.b[[j]])
}
}
# PRINT RESULTS
list.ab