15

假设我有两个列表:

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

等等。我觉得我在这里错过了一些相对简单的东西。有什么帮助吗?

干杯。

4

6 回答 6

17

expand.grid(list.a, list.b)在 a 中为您提供所需的结果data.frame。这往往是在 R 中处理数据最有用的格式。但是,您可以通过调用applyand获得您要求的确切结构(保存排序) 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))]
于 2012-10-22T19:18:33.060 回答
9

您想要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)
于 2013-05-25T20:29:45.037 回答
5

很惊讶没有人提到这个简单的单行:

as.list(outer(list.a,list.b, paste))

[[1]]
[1] "a d"

[[2]]
[1] "b d"

[[3]]
[1] "c d"

[[4]]
[1] "a e"
于 2018-05-27T12:56:15.817 回答
3

这会让你得到你正在寻找的东西:

unlist(lapply(list.a, function(X) {
    lapply(list.b, function(Y) {
        c(X, Y)
    })
}), recursive=FALSE)
于 2012-10-22T19:40:43.913 回答
3

这是一个您可以将列表传递给以展开的函数

expand.list <- function(...){
   lapply(as.data.frame(t((expand.grid(...)))),c, recursive = TRUE, use.names = FALSE)}

 expand.list(list.a, list.b)
于 2012-10-22T22:37:27.833 回答
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
于 2012-10-22T19:52:16.117 回答