Скажем, у меня есть матрица с 1000 столбцами. Я хочу создать новую матрицу со всеми остальными n столбцами из исходной матрицы, начиная со столбца i.

Итак, допустим, что n=3 и i=5, тогда мне нужны столбцы из старой матрицы 5,6,7,11,12,13,17,18,19 и так далее.

3
G.N. 3 Сен 2017 в 13:55

4 ответа

Лучший ответ

Используя два seq() для создания начальных и конечных границ, затем используйте mapply() для них, чтобы построить ваши истинные интервалы индекса столбца. Затем просто нормальные скобки для извлечения из вашей матрицы.

set.seed(1)
# using 67342343's test case
M <- matrix(runif(100^2), ncol = 100)
n <- 3
i <- 5

starts <- seq(i, ncol(M), n*2)
stops <- seq(i+(n-1), ncol(M), n*2)
col_index <- c(mapply(seq, starts, stops)) # thanks Jaap and Sotos

col_index
[1]  5  6  7 11 12 13 17 18 19 23 24 25 29 30 31 35 36 37 41 42 43 47 48 49 53 54 55 59 60 61 65 66 67 71 72 73 77 78
[39] 79 83 84 85 89 90 91 95 96 97

M[, col_index]
8
Nate 3 Сен 2017 в 11:40

Я написал бы функцию, которая определяет индексы столбцов, которые вы хотите, и затем вызвал бы эту функцию по мере необходимости.

col_indexes <- function(mat, start = 1, by = 1){
    n <- ncol(mat)
    inx <- seq(start, n, by = 2*by)
    inx <- c(sapply(inx, function(i) i:(i + by -1)))
    inx[inx <= n]
}

m <- matrix(0, nrow = 1, ncol = 20)
icol <- col_indexes(m, 5, 3)
icol
[1]  5  6  7 11 12 13 17 18 19
4
Rui Barradas 3 Сен 2017 в 11:29

Вот метод, использующий outer.

c(outer(5:7, seq(0L, 95L, 6L), "+"))
[1]  5  6  7 11 12 13 17 18 19 23 24 25 29 30 31 35 36 37 41 42 43 47 48 49 53 
[26] 54 55 59 60 61 65 66 67 71 72 73 77 78 79 83 84 85 89 90 91 95 96 97

Чтобы обобщить это, вы могли бы сделать

idx <- c(outer(seq(i, i + n), seq(0L, ncol(M) - i, 2 * n), "+"))

Идея состоит в том, чтобы создать начальный набор столбцов (5:7 или seq(i, i + n)), вычислить начальные точки для каждого последующего набора (seq(0L, 95L, 6L) или seq(0L, ncol(M) - i, 2 * n)), а затем использовать {{X4 }} чтобы вычислить сумму каждой комбинации этих двух векторов.

Вы можете использовать матрицу с помощью [, например M[, idx].

3
lmo 3 Сен 2017 в 12:22

Еще одно решение основано на том факте, что R использует индекс переработка:

i <- 5; n <- 3
M <- matrix(runif(100^2), ncol = 100)
id <- seq(i, ncol(M), by = 1)[rep(c(TRUE, FALSE), each = n)]
M_sub <- M[, id]
5
67342343 3 Сен 2017 в 11:18