ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在尝试从 R 中两个不同大小的向量中创建所有元素的独特组合。

例如,第一个向量是

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) 的所有元素并列来寻找一个独特的组合。

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

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


G
Gregor Thomas

这也许是你所追求的

> 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 泛化到任意数量的输入列。


并且不需要 plyr 来进行排序:result <- expand.grid(a=a,b=b); result <- result[order(result$a,result$b),];
比我有更多代表的人能够接受这个答案吗?
如果顺序和名称应与问题中的一样:expand.grid(b=b,a=a)[2:1]
注意标题是唯一组合 - 这个答案解决了 OP 问题,但如果 2 列是相同的数据类型并且你应用 expand.grid,你将有唯一的排列,而不是唯一的组合
h
hypothesis

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

J
Jaap

概述中缺少 -package 中的 CJ-function。使用:

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

给出:

ab 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 自动命名结果列(另请参阅 herehere)。


t
tmfmnk

从 1.0.0 版开始,tidyr 提供了自己的 expand.grid() 版本。它completes the existing family of expand(), nesting(), and crossing() with a low-level function that works with vectors

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

j
jay.sf

您可以使用 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`

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅