按列

时间:2017-09-03 10:55:41

标签: r matrix

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

所以,请说n=3i=5,然后我需要的旧矩阵列5,6,7,11,12,13,17,18,19,依此类推。

4 个答案:

答案 0 :(得分:8)

使用两个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]

答案 1 :(得分: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]

答案 2 :(得分:4)

我会编写一个函数来确定所需列的索引,然后根据需要调用该函数。

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

答案 3 :(得分:3)

以下是使用if let myRating = Double(myString) { self.newRating = self.rounded(myRating, toNearest:0.25) self.ratingView.rating = self.newRating! let stringValue = String(describing: self.newRating) self.ratingLabel.text = stringValue print("My rating label is: \(self.ratingLabel.text)") } 的方法。

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)计算这两个向量的每个组合的总和。

您可以使用outer[来对矩阵进行子集化。