Contoh yang dapat direproduksi:

set.seed(1)
testMat <- matrix(round(runif(3*6,1,5)), nrow = 3, ncol = 6)

Keluaran:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    2    5    5    1    4    3
[2,]    2    2    4    2    3    4
[3,]    3    5    4    2    4    5

Di sini 3 kolom pertama (1,2,3) milik satu set dan 3 kolom berikutnya (4,5,6) milik set yang lain. Saya ingin menambahkan satu kolom dari setiap set dan perlu melakukannya untuk semua kombinasi yang mungkin.

Untuk contoh ini, saya harus mendapatkan 9 vektor yang dihasilkan karena ada 9 kombinasi:

Combination 1: (1,4) = (3,4,5)
Combination 2: (1,5) = (6,5,7)
Combination 3: (1,6) = (.,.,.)
Combination 4: (2,4) = (.,.,.)
Combination 5: (2,5) = (.,.,.)
Combination 6: (2,6) = (.,.,.)
Combination 7: (3,4) = (.,.,.) 
Combination 8: (3,5) = (.,.,.)
Combination 9: (3,6) = (.,.,.)

Apakah ada cara elegan untuk melakukannya, terutama ketika jumlah kolom bisa lebih tinggi? Misalnya 9, 12, dll. Akan menghasilkan kombinasi masing-masing 27 dan 81.

EDIT: Klarifikasi lebih: masing-masing 3 kolom (mis. 1: 3, 4: 6, 7: 9, 10:12, ... dll.) Bangun satu set dan tujuannya adalah dengan satu set dan menambahkannya bersama-sama . Misalnya jika kami memiliki 6 kolom di testmat kami ambil 1 kolom di antara 1: 3 dan lainnya dari 4: 6 Tambahkan kolom TEE 2 bersama-sama. Demikian pula untuk 9 kita tambahkan 3, untuk 12 kita tambahkan 4 kolom satu dari setiap set.

3
Rel_Ai 5 April 2021, 03:03

2 jawaban

Inilah pendekatan dengan untuk menghasilkan permutasi:

library(RcppAlgos)

my_vals = function (...) {
    dots = list(...)
    ncols = ...length()
    cols = permuteGeneral(3L, ncols, TRUE)
    
    Reduce(`+`, Map(`[`, dots, asplit(cols,2L)))
}

do.call('my_fun', asplit(array(testMat, c(3L, 3L, ncol(testMat) / 3L)), 3L))

Pendekatan ini mengubah matriks menjadi daftar submatrices yang kemudian diikat oleh permutasi.

4
Cole 5 April 2021, 01:57

Expand.grid bisa sangat membantu:


nc <- ncol( testMat )

if( nc %% 3 != 0 ) {
  stop( "Your data's number of columns should be a multiple of 3!")
}

n <- ncol( testMat ) / 3

args <- sapply( 1:n, function(i) (i*3-2):(i*3), simplify=FALSE )

combs <- do.call( expand.grid, args ) %>% arrange( Var1 )

combs %>% apply( 1, function(r) {
              rowSums( testMat[, r] )
          })



Keluaran:


> combs %>% apply( 1, function(r) {
+               rowSums( testMat[, r ] )
+           })
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    3    6    5    6    9    8    6    9    8
[2,]    4    5    6    4    5    6    6    7    8
[3,]    5    7    8    7    9   10    6    8    9

4
Sirius 5 April 2021, 01:55