118

Rでサイズの異なる2つのベクトルからすべての要素の一意の組み合わせを作成しようとしています.

たとえば、最初のベクトルは

a <- c("ABC", "DEF", "GHI")

2番目は現在文字列として保存されている日付です

b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05")

このような2つの列を持つデータフレームを作成する必要があります

> data
    a          b
1  ABC 2012-05-01
2  ABC 2012-05-02
3  ABC 2012-05-03
4  ABC 2012-05-04
5  ABC 2012-05-05
6  DEF 2012-05-01
7  DEF 2012-05-02
8  DEF 2012-05-03
9  DEF 2012-05-04
10 DEF 2012-05-05
11 GHI 2012-05-01
12 GHI 2012-05-02
13 GHI 2012-05-03
14 GHI 2012-05-04
15 GHI 2012-05-05

基本的に、1 つのベクトル (a) のすべての要素と 2 番目のベクトル (b) のすべての要素を並置することによって、一意の組み合わせを探しています。

理想的な解決策は、より多くの入力ベクトルに一般化することです。


参照:
組み合わせのマトリックスを生成する方法

4

5 に答える 5

160

これはおそらくあなたが求めているものです

> expand.grid(a,b)
   Var1       Var2
1   ABC 2012-05-01
2   DEF 2012-05-01
3   GHI 2012-05-01
4   ABC 2012-05-02
5   DEF 2012-05-02
6   GHI 2012-05-02
7   ABC 2012-05-03
8   DEF 2012-05-03
9   GHI 2012-05-03
10  ABC 2012-05-04
11  DEF 2012-05-04
12  GHI 2012-05-04
13  ABC 2012-05-05
14  DEF 2012-05-05
15  GHI 2012-05-05

結果の順序が希望どおりでない場合は、後で並べ替えることができます。引数に という名前を付けるとexpand.grid、それらは列名になります。

df = expand.grid(a = a, b = b)
df[order(df$a), ]

またexpand.grid、任意の数の入力列に一般化します。

于 2012-07-09T02:13:48.180 に答える
36

このtidyrパッケージは、(1) 文字列が因数に変換されず、(2) 並べ替えがより直感的であるためcrossing、従来の関数よりも優れた代替手段を提供します。expand.grid

library(tidyr)

a <- c("ABC", "DEF", "GHI")
b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05")

crossing(a, b)

# A tibble: 15 x 2
       a          b
   <chr>      <chr>
 1   ABC 2012-05-01
 2   ABC 2012-05-02
 3   ABC 2012-05-03
 4   ABC 2012-05-04
 5   ABC 2012-05-05
 6   DEF 2012-05-01
 7   DEF 2012-05-02
 8   DEF 2012-05-03
 9   DEF 2012-05-04
10   DEF 2012-05-05
11   GHI 2012-05-01
12   GHI 2012-05-02
13   GHI 2012-05-03
14   GHI 2012-05-04
15   GHI 2012-05-05
于 2018-06-20T21:37:57.870 に答える
3

order 関数を使用して、任意の数の列を並べ替えることができます。あなたの例のために

df <- expand.grid(a,b)
> df
   Var1       Var2
1   ABC 2012-05-01
2   DEF 2012-05-01
3   GHI 2012-05-01
4   ABC 2012-05-02
5   DEF 2012-05-02
6   GHI 2012-05-02
7   ABC 2012-05-03
8   DEF 2012-05-03
9   GHI 2012-05-03
10  ABC 2012-05-04
11  DEF 2012-05-04
12  GHI 2012-05-04
13  ABC 2012-05-05
14  DEF 2012-05-05
15  GHI 2012-05-05

> df[order( df[,1], df[,2] ),] 
   Var1       Var2
1   ABC 2012-05-01
4   ABC 2012-05-02
7   ABC 2012-05-03
10  ABC 2012-05-04
13  ABC 2012-05-05
2   DEF 2012-05-01
5   DEF 2012-05-02
8   DEF 2012-05-03
11  DEF 2012-05-04
14  DEF 2012-05-05
3   GHI 2012-05-01
6   GHI 2012-05-02
9   GHI 2012-05-03
12  GHI 2012-05-04
15  GHI 2012-05-05`
于 2018-06-03T18:32:09.423 に答える