说,我有两个清单:
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
等等。我觉得我在这里错过了一些相对简单的东西。有什么帮助吗?
干杯。
答案 0 :(得分:12)
expand.grid(list.1, list.b)
在data.frame
结构中为您提供所需的结果。这往往是在R中处理数据的最有用的格式。但是,通过调用apply
和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))]
答案 1 :(得分:5)
你想要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)
答案 2 :(得分:3)
这可以满足您的需求:
unlist(lapply(list.a, function(X) {
lapply(list.b, function(Y) {
c(X, Y)
})
}), recursive=FALSE)
答案 3 :(得分:2)
这是一个可以传递列表以扩展
的功能expand.list <- function(...){
lapply(as.data.frame(t((expand.grid(...)))),c, recursive = TRUE, use.names = FALSE)}
expand.list(list.a, list.b)
答案 4 :(得分:2)
很惊讶没人提到这个简单的一个班轮:
as.list(outer(list.a,list.b, paste))
[[1]]
[1] "a d"
[[2]]
[1] "b d"
[[3]]
[1] "c d"
[[4]]
[1] "a e"
答案 5 :(得分:1)
这是一个有点蛮力的方法,如果它们是相同的维度,将使用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