使用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
然后我想对每个向量执行操作。
答案 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::expand
和nesting
来获取每组列的组合:
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