2016-07-05 7 views
0

私はリストを持っており、そのリストから特定の番号を選択しようとしています。Rでは、リスト内のすべての要素の組み合わせを取得して連結するにはどうすればよいですか?

 [,1]  [,2]  [,3]  

[1,] Numeric,3 Numeric,3 Numeric,3 

[2,] Numeric,3 Numeric,3 Numeric,3 

マトリックス: - 例えば:combn(X、2)

yは次のようになり

Y <:

x <- list() 
x[[1]] <- c(1,2,3) 
x[[2]] <- c(4,5,6) 
x[[3]] <- c(7,8,9) 

は今これを行います各セットを表す列が返されます。しかし、私はそれらを列方向に連結したいが、私はそうすることはできない。

CBIND(Y)

 [,1]  [,2]  [,3]  

[1,] Numeric,3 Numeric,3 Numeric,3 

[2,] Numeric,3 Numeric,3 Numeric,3 

一つだけの行があるはずですが、二つがあります!また、私は特定の要素を連結するとき、これが起こる:

C(Y [1,1]、Y [2,1])

[[1]] 

[1] 1 2 3 

[[2]] 

[1] 4 5 6 

がこれは単なる一例です。実際のリストははるかに大きいです。どうすればこれを達成できますか?基本的に、私はk倍のクロス検証をしようとしていますが、データの各サブセットがリストにあります。

+2

期待どおりの結果が得られましたか? –

+1

"k倍交差検定" ...あなたは 'ライブラリ(キャレット)'を調べましたか? – N8TRO

+0

元のリストの3つの要素のうち2つを1つずつ組み合わせたリストが必要です。 – Bob

答えて

0

あなたの例に続き、あなたのリストから同じ長さでない場合は、これを試すことができます:

for(counter in i : ncol(y)){ 
    newList[[counter]] <- do.call(c, y[1 : 2, counter] 
} 
1

あなたが望むのは、各リストをマトリックス内の列にすることです。そうでない場合は、質問を修正してください。

do.call()を使用します。私はこの関数(?do.call)のドキュメントを見ることをお勧めしますが、簡単にリスト上の関数を実行します。

x <- list() 
x[[1]] <- c(1,2,3) 
x[[2]] <- c(4,5,6) 
x[[3]] <- c(7,8,9) 

do.call(cbind, x) 
    [,1] [,2] [,3] 
[1,] 1 4 7 
[2,] 2 5 8 
[3,] 3 6 9 
+0

それは動作しますが、実際のリストの要素の長さは同じではありませんか?私は何をしますか? – Bob

+1

この場合、おそらく行列に物を格納したくないでしょう。あなたの最終目標は何ですか? – SamPassmore

+0

私の最終目標は、k倍のクロスバリデーションを行うことです。私は自分のデータのサブセットのすべての組み合わせを取りたいと思っています(ただし、サブセットはすべて同じ長さではありません)。行列を返すのはcombn関数です。どうすればこれをやめることができますか? – Bob

0

あなただけのcombnとインデックスの行列を作ることができますし、その両端applydo.call(cbind, ...)各ペアをする。

apply(combn(1:3, 2), 2, function(i){list(do.call(cbind, x[i]))}) 
## [[1]] 
## [[1]][[1]] 
##  [,1] [,2] 
## [1,] 1 4 
## [2,] 2 5 
## [3,] 3 6 
## 
## 
## [[2]] 
## [[2]][[1]] 
##  [,1] [,2] 
## [1,] 1 7 
## [2,] 2 8 
## [3,] 3 9 
## 
## 
## [[3]] 
## [[3]][[1]] 
##  [,1] [,2] 
## [1,] 4 7 
## [2,] 5 8 
## [3,] 6 9 

要素がうるさくネストされているが、purrr::flatten()呼び出しが簡単に十分な構造をneatens:あなたはとてもapplyは1つの行列にすべてを簡素化していない余分なlist()コールが必要になります。

1

これは引数を持つので、combnの中で使用できます。

combn(1:3, 2, FUN = function(i) list(do.call(cbind, x[i]))) 
#[[1]] 
#  [,1] [,2] 
#[1,] 1 4 
#[2,] 2 5 
#[3,] 3 6 

#[[2]] 
#  [,1] [,2] 
#[1,] 1 7 
#[2,] 2 8 
#[3,] 3 9 

#[[3]] 
#  [,1] [,2] 
#[1,] 4 7 
#[2,] 5 8 
#[3,] 6 9 
2

リストインデックスを組み合わせて、それぞれの組み合わせに対して、対応する2つのリストコンポーネントをベクトルに結合することができます。我々はcombn()simplify=Fを渡す必要があり、リスト構造を維持するために

combn(seq_along(x),2L,function(i) c(x[[i[1L]]],x[[i[2L]]]),simplify=F); 
## [[1]] 
## [1] 1 2 3 4 5 6 
## 
## [[2]] 
## [1] 1 2 3 7 8 9 
## 
## [[3]] 
## [1] 4 5 6 7 8 9 
## 

実際にそれを行うためのより簡単な方法があります:

combn(x,2L,unlist,simplify=F); 
## [[1]] 
## [1] 1 2 3 4 5 6 
## 
## [[2]] 
## [1] 1 2 3 7 8 9 
## 
## [[3]] 
## [1] 4 5 6 7 8 9 
## 
関連する問題