【问题标题】:Find all Combinations of a Given Number of Elements from Two or More Vectors从两个或多个向量中找到给定数量元素的所有组合
【发布时间】:2017-02-15 04:05:13
【问题描述】:

使用 R,我试图从两个或多个向量中系统地识别给定数量的元素的所有可能组合。

例如,如果我有

first <- 10, 20, 30
second <- 1, 2, 3

我想从每个向量中创建一个包含 n=2 个元素的所有可能组合的矩阵,这样我最终得到

1, 2, 10, 20
1, 2, 20, 30
1, 2, 10, 30
2, 3, 10, 20
2, 3, 20, 30
2, 3, 10, 30
1, 3, 10, 20
1, 3, 20, 30
1, 3, 10, 30

然后我想对这些向量中的每一个执行操作。

【问题讨论】:

  • df &lt;- expand.grid(first, first, second, second); df[df$Var1 &lt; df$Var2 &amp; df$Var3 &lt; df$Var4, ]

标签: r vector


【解决方案1】:

两种选择:


expand.grid

使用expand.grid 获取所有组合,并将子集设置为您想要的组合:

df <- expand.grid(first, first, second, second)
df[df$Var1 < df$Var2 & df$Var3 < df$Var4, ]

##    Var1 Var2 Var3 Var4
## 31   10   20    1    2
## 34   10   30    1    2
## 35   20   30    1    2
## 58   10   20    1    3
## 61   10   30    1    3
## 62   20   30    1    3
## 67   10   20    2    3
## 70   10   30    2    3
## 71   20   30    2    3

combn 和 tidyr

使用combn得到每组组合,排列成data.frame,使用tidyr::expandnesting得到每组列的组合:

library(tidyr)

data.frame(t(rbind(combn(first, 2), combn(second, 2)))) %>% 
    expand(nesting(X1, X2), nesting(X3, X4))

## # A tibble: 9 × 4
##      X1    X2    X3    X4
##   <dbl> <dbl> <dbl> <dbl>
## 1    10    20     1     2
## 2    10    20     1     3
## 3    10    20     2     3
## 4    10    30     1     2
## 5    10    30     1     3
## 6    10    30     2     3
## 7    20    30     1     2
## 8    20    30     1     3
## 9    20    30     2     3

【讨论】:

    【解决方案2】:

    我们可以使用data.table

    library(data.table)
    CJ(first, first, second, second)[V1 < V2 & V3 < V4]
    #   V1 V2 V3 V4
    #1: 10 20  1  2
    #2: 10 20  1  3
    #3: 10 20  2  3
    #4: 10 30  1  2
    #5: 10 30  1  3
    #6: 10 30  2  3
    #7: 20 30  1  2
    #8: 20 30  1  3
    #9: 20 30  2  3
    

    【讨论】:

      猜你喜欢
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 2010-11-13
      相关资源
      最近更新 更多