从两个或多个向量中查找给定数量元素的所有组合

时间:2017-02-15 04:05:13

标签: r vector

使用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

然后我想对每个向量执行操作。

2 个答案:

答案 0 :(得分:2)

两个选项:

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

答案 1 :(得分:0)

我们可以使用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