按列从矩阵中提取块

G.N*_*.N. 3 r matrix

假设我有一个1000列的矩阵.我想n从列开始创建一个新矩阵,其中包含原始矩阵中的每个其他列i.

因此,我们说n=3i=5,然后我从旧胎体所需要的列5,6,7,11,12,13,17,18,19等.

Nat*_*ate 8

使用两个seq()s来创建开始和结束边界,然后使用mapply()on来构建真正的列索引间隔.然后只需从您的矩阵中提取正常的括号表示法.

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]
Run Code Online (Sandbox Code Playgroud)

  • 您可以删除`as.numeric` imo并将`mapply`调用包装在`c()`中.旁注:最好使用`TRUE`而不是`T`. (2认同)
  • 当然用`c()`包装它会使`SIMPLIFY`参数变得多余 (2认同)

小智 5

另一个解决方案是基于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]
Run Code Online (Sandbox Code Playgroud)