有没有一种有效的方法可以从顶部或底部开始每行将矩阵移动一列? 例如,请考虑以下矩阵: [,1] [,2] [,3] [,4] [,5][1,] 1 4 7 10 13[2,] 2 5 8 11 14[3,] 3 6 9 12 15 如果从下往上移动,它应该如下所示
例如,请考虑以下矩阵:
[,1] [,2] [,3] [,4] [,5] [1,] 1 4 7 10 13 [2,] 2 5 8 11 14 [3,] 3 6 9 12 15
如果从下往上移动,它应该如下所示:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [1,] NA NA 1 4 7 10 13 [2,] NA 2 5 8 11 14 NA [3,] 3 6 9 12 15 NA NA
如果从顶部向下移动,它应该如下所示:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [1,] 1 4 7 10 13 NA NA [2,] NA 2 5 8 11 14 NA [3,] NA NA 3 6 9 12 15
这是我用for循环做的方法,但我想知道是否有更简单的方法:
oldNumCols <- ncol(matrix.data) newNumCols <- sum(dim(matrix.data))-1 shiftedData <- matrix(NA, nrow = nrow(matrix.data), ncol = newNumCols) for(i in 1:nrow(matrix.data)) { #posToReplace <- newNumCols - oldNumCols + 1:oldNumCols - i + 1 # shifting from the bottom up posToReplace <- 1:oldNumCols + i - 1 # shifting from the top down shiftedData[i,] <- replace(shiftedData[i,], posToReplace, matrix.data[i,]) }您可以尝试一些花哨的矩阵索引来放置值.例如,这是一个可以提供帮助的功能
rowslide <- function(x, bottomup=FALSE) { m <- matrix(NA, nrow=nrow(x), ncol=ncol(x)+nrow(x)-1) a <- -1 b <- nrow(x) if(bottomup) { a <- 1 b <- -1 } idx<-cbind( rep(1:nrow(x), each=ncol(x)), a*rep(1:nrow(x), each=ncol(x))+1:ncol(x)+b ) m[idx]<-t(x) m }
我们用它来测试它
x<-matrix(1:15, nrow=3) rowslide(x) # [,1] [,2] [,3] [,4] [,5] [,6] [,7] # [1,] 1 4 7 10 13 NA NA # [2,] NA 2 5 8 11 14 NA # [3,] NA NA 3 6 9 12 15 rowslide(x, TRUE) # [,1] [,2] [,3] [,4] [,5] [,6] [,7] # [1,] NA NA 1 4 7 10 13 # [2,] NA 2 5 8 11 14 NA # [3,] 3 6 9 12 15 NA NA