2017-12-02 8 views
1

は、私が2(またはそれ以上)のベクトルを持っていると言う:Rの2つ以上のベクトルからネストされたリストを作成しますか?

v1 <- letters[1:2] 
v2 <- letters[24:26] 

> v1 
[1] "a" "b" 

> v2 
[1] "x" "y" "z" 

どのように私はプログラム的に私の入力ベクトルの組み合わせのすべてのリストが含まれています。このようなネストされたリストを構築だろうか?編集:私は非効率的なループ構造なしでこれをしたいと思います。

> l1 <- list(list(v1[1], v2[1]), list(v1[1], v2[2]), 
     list(v1[1], v2[3]), list(v1[2], v2[1]), 
     list(v1[2], v2[2]), list(v1[2], v2[3])) 

> str(l1) 
List of 6 
$ :List of 2 
..$ : chr "a" 
..$ : chr "x" 
$ :List of 2 
..$ : chr "a" 
..$ : chr "y" 
$ :List of 2 
..$ : chr "a" 
..$ : chr "z" 
$ :List of 2 
..$ : chr "b" 
..$ : chr "x" 
$ :List of 2 
..$ : chr "b" 
..$ : chr "y" 
$ :List of 2 
..$ : chr "b" 
..$ : chr "z" 
+0

データフレームではなく、リストに必要な具体的な理由はありますか? –

+0

はい、do.call:lapply(my_nested_list、do.call、what = my_function)と組み合わせて使用​​します。 – FB001

+0

これを明確にすることはできますか?それがデータフレームで使用されないようにする関数のいくつかの特性はありますか? –

答えて

1

簡単な方法は、ループを使用することです:

l1 <- list() 
list_pos <- 1L 

for (i in 1:length(v1)) { 
    for (j in 1:length(v2)) { 
    l1[[list_pos]] <- list(v1[i], v2[j]) 
    list_pos <- list_pos + 1L 
    } 
} 

編集

私はループが不公平な担当者のビットを取得すると思いますが、ここではそれらを回避し、いくつかの(醜い)コードであります:

l2 <- apply(expand.grid(v1, v2), 1, as.list) 

Btw。ループは高速です。私は、これをやるためにもっときれいで創造的なやり方があると思う。

+0

私は、ループを避けるために、もっと良いコードを書く方法を学ぶ以外の理由がないと言いました。 – FB001

+0

ありがとう - これは、私が探している構造を生成します。ループについての私の前提も再検討します。確かにわかりませんが、私は、ループのパフォーマンスは、より長いベクトルまたはベクトルの増加した数ではうまくいきません。 – FB001

+0

私はそれがスケールが悪いと思いますが、適用関数も隠れたループです。 – snoram

1

データフレームに必要な組み合わせを生成するソリューションです。データフレームがリストエントリごとに1つの組み合わせのlist()に分割する必要がある場合

> v1 <- letters[1:2] 
> v2 <- letters[24:26] 
> 
> aResult <- expand.grid(v2,v1) 
> View(aResult) 
> aResult 
    Var1 Var2 
1 x a 
2 y a 
3 z a 
4 x b 
5 y b 
6 z b 
> 

、我々はsplit()でこれを達成することができます。

リストの最初の要素を印刷すると、次のようになります。

> theList[[1]] 
    Var1 Var2 id 
1 x a 1 
> 
関連する問題