假设我有一个包含1000列的矩阵。我想从原始矩阵中的每个其他n
列创建一个新矩阵,从列i
开始。
所以,请说n=3
和i=5
,然后我需要的旧矩阵列5,6,7,11,12,13,17,18,19
,依此类推。
答案 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
等[
来对矩阵进行子集化。