来自两个(或更多)向量的所有元素的独特组合

God*_*del 85 r r-faq

我试图在R中创建两个不同大小的矢量的所有元素的独特组合.

例如,第一个向量是

a <- c("ABC", "DEF", "GHI")
Run Code Online (Sandbox Code Playgroud)

第二个是当前存储为字符串的日期

b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05")
Run Code Online (Sandbox Code Playgroud)

我需要创建一个包含两列的数据框

> 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
Run Code Online (Sandbox Code Playgroud)

所以基本上,我正在寻找一个独特的组合,考虑一个矢量的所有元素(a)与第二个矢量(b)的所有元素并置.

理想的解决方案将推广到更多输入向量.


另请参见:
如何生成组合矩阵

shh*_*its 118

这也许就是你所追求的

> 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
Run Code Online (Sandbox Code Playgroud)

如果生成的订单不是您想要的,您可以在之后进行排序.如果将参数命名为expand.grid,则它们将成为列名:

df = expand.grid(a = a, b = b)
df[order(df$a), ]
Run Code Online (Sandbox Code Playgroud)

expand.grid推广到任意数量的输入列.

  • 并且不需要`plyr`来进行排序:`result < - expand.grid(a = a,b = b); 结果< - 结果[order(结果$ a,结果$ b),];` (3认同)
  • 比我更有代表的人能够接受这个答案吗? (2认同)

hyp*_*sis 22

tidyr软件包提供了一个不错的选择crossing,它比经典expand.grid函数更好,因为(1)字符串不会转换为因子,(2)排序更直观:

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
Run Code Online (Sandbox Code Playgroud)


Jaa*_*aap 8

缺少这个概述是CJ从-function -package。使用:

library(data.table)
CJ(a, b, unique = TRUE)
Run Code Online (Sandbox Code Playgroud)

给出:

      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
Run Code Online (Sandbox Code Playgroud)

注意:从1.12.2版开始,CJ自动为结果列命名(另请参见herehere)。


tmf*_*mnk 7

从 1.0.0 版开始,tidyr提供了自己的expand.grid(). 它完成了对现有的家庭expand()nesting()以及crossing()具有低级别的功能,与矢量作品

与 相比时base::expand.grid()

最快地改变第一个元素。从不将字符串转换为因子。不添加任何附加属性。返回一个小标题,而不是一个数据框。可以扩展任何广义向量,包括数据框。

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

tidyr::expand_grid(a, b)

   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
Run Code Online (Sandbox Code Playgroud)