15

2つのリストがあるとします。

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)で目的の結果が得られます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))]
于 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

これは、リストを渡して展開できる関数です。

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 に答える
3

これにより、探しているものが得られます。

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

これはやや強引なアプローチであり、同じ次元である場合、append関数を使用してlist.aを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 に答える