R 来自两个(或多个)向量的所有元素的唯一组合

R 来自两个(或多个)向量的所有元素的唯一组合,r,r-faq,data.table,R,R Faq,Data.table,我试图从R中两个大小不同的向量创建一个唯一的所有元素组合 例如,第一个向量是 a <- c("ABC", "DEF", "GHI") 基本上,我在寻找一个唯一的组合,考虑一个向量(a)的所有元素与第二个向量(b)的所有元素并置 理想的解决方案可以推广到更多的输入向量 另请参见: 这也许是你想要的 > expand.grid(a,b) Var1 Var2 1 ABC 2012-05-01 2 DEF 2012-05-01 3 GHI 2012-05-

我试图从R中两个大小不同的向量创建一个唯一的所有元素组合

例如,第一个向量是

a <- c("ABC", "DEF", "GHI")
基本上,我在寻找一个唯一的组合,考虑一个向量(a)的所有元素与第二个向量(b)的所有元素并置

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


另请参见:


这也许是你想要的

> 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), ]

展开。网格
泛化为任意数量的输入列。

您可以使用排序函数对任意数量的列进行排序。以你为例

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`
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[顺序(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`

tidyr软件包提供了一个不错的选择
交叉
,它比经典的
扩展网格
功能工作得更好,因为(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
library(tidyr)
本概述中缺少的一个是-package中的
CJ
-功能。使用:

library(data.table)
CJ(a, b, unique = TRUE)
给出:



注:自1.12.2版以来,
CJ
自动命名结果列(另请参见和)。

自1.0.0版以来,
tidyr
提供了自己的
expand.grid()
版本。它

base::expand.grid()
相比:

第一个元素变化最快。从不将字符串转换为因子。 不添加任何其他属性。返回TIBLE,而不是数据 框架可以扩展任何广义向量,包括数据帧


a无需进行排序:
plyr
结果是有比我更具代表性的人能够接受这个答案吗?如果顺序和名称应如问题所示:
expand.grid(b=b,a=a)[2:1]
注意标题是唯一的组合-这个答案解决了OP问题,但是,如果这两列的数据类型相同,并且您应用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
library(data.table)
CJ(a, b, unique = TRUE)
      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
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