a <- c("ABC", "DEF", "GHI")
,第二个是当前以字符串形式存储的日期
b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05")
我需要创建一个具有两列的数据框,像这样
> 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
因此,基本上,我正在通过考虑一个矢量(a)的所有元素与第二个矢量(b)的所有元素并置的唯一组合。
理想的解决方案将推广到更多的输入向量。
另请参见:如何生成组合矩阵
#1 楼
这可能是您想要的东西> 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
可以推广到任意数量的输入列。#2 楼
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
#3 楼
在r-faq概述中缺少data.table-package中的CJ
-函数。使用方法: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
注意:从1.12.2版开始,
CJ
会自动命名结果列(另请参见此处和此处)。#4 楼
从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
#5 楼
您可以使用订单功能对任意数量的列进行排序。对于您的示例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`
评论
而且不需要plyr进行排序:result <-expand.grid(a = a,b = b);结果<-result [order(result(result $ a,result $ b),];
–thelatemail
2012年7月9日在3:55
代表比我更多的人能够接受此答案吗?
–乔什
19年8月26日在20:29
如果顺序和名称应与问题相同:expand.grid(b = b,a = a)[2:1]
– GKi
19/12/17在9:40
请注意,标题为“唯一组合”(Unique Combinations)-此答案解决了OP问题,但是如果2列的数据类型相同,并且您应用expand.grid,则将具有唯一的排列,而不是唯一的组合
–布伦特
5月13日22:46