Выбор всех комбинаций строк из матрицы - PullRequest
0 голосов
/ 28 августа 2018

У меня есть матрица, состоящая из 10 строк, Я хотел бы сделать комбинацию между этими строками, используя R, например:

M= matrix(c(
     1,2,3,4,
     5,6,7,3,
     5,5,4,8,
     5,2,7,8,
     4,8,7,8,
     2,6,7,9,
     5,6,7,4,
     5,6,7,2,
     5,6,7,3,
     5,6,7,0),nrow=10, byrow=TRUE)

Первый шаг

комбинация (3 ряда) из (10 рядов).

Это означает, что у нас есть другие матрицы (полученные из матрицы M), их число 120-матрица (3 * 4)

Второй шаг

комбинация (6 рядов) из (10 рядов) Это означает, что у нас есть другие матрицы (мы также получаем из матрицы M) их число 210-матрица (6 * 4)

1 Ответ

0 голосов
/ 11 сентября 2018

Вы можете разделить matrix с apply до list строк, чем использовать функцию combn, как показано ниже:

M <- structure(c(1, 5, 5, 5, 4, 2, 5, 5, 5, 5, 2, 6, 5, 2, 8, 6, 6, 
6, 6, 6, 3, 7, 4, 7, 7, 7, 7, 7, 7, 7, 4, 3, 8, 8, 8, 9, 4, 2, 
3, 0), .Dim = c(10L, 4L))
x <- apply(M, 1, list)
# combinations for three rows
cmbs3 <- combn(x, 3) 
ncol(cmbs3)
# 120
cmbs3[, 2]
# second combination
# [[1]]
# [[1]][[1]]
# [1] 1 2 3 4
# 
# 
# [[2]]
# [[2]][[1]]
# [1] 5 6 7 3
# 
# 
# [[3]]
# [[3]][[1]]
# [1] 5 2 7 8

# combinations for six rows
cmbs6 <- combn(x, 6)
ncol(cmbs6)
# 210

EDIT: Или используйте решение elgant, предоставленное nicola - поднабор по индексу строки, сгенерированному combn (мне это нравится гораздо больше:):

lapply(combn(10, 3, simplify = FALSE), function(x) M[x, ])

Выход:

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

[[2]]
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    3
[3,]    5    2    7    8
...
[[119]]
     [,1] [,2] [,3] [,4]
[1,]    5    6    7    4
[2,]    5    6    7    3
[3,]    5    6    7    0

[[120]]
     [,1] [,2] [,3] [,4]
[1,]    5    6    7    2
[2,]    5    6    7    3
[3,]    5    6    7    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...