我试图在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推广到任意数量的输入列.
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)
缺少这个R-FAQ概述是CJ从-function data.table -package。使用:
library(data.table)
CJ(a, b, unique = TRUE)
Run Code Online (Sandbox Code Playgroud)
给出:
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
注意:从1.12.2版开始,CJ自动为结果列命名(另请参见here和here)。
从 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)
| 归档时间: |
|
| 查看次数: |
69809 次 |
| 最近记录: |