R中两个列表的元素组合

时间:2012-10-22 19:14:16

标签: r elementwise-operations

说,我有两个清单:

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

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

干杯。

6 个答案:

答案 0 :(得分:12)

expand.grid(list.1, list.b)data.frame结构中为您提供所需的结果。这往往是在R中处理数据的最有用的格式。但是,通过调用applylapply,您可以得到您要求的确切结构(保存顺序):

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