有没有一种有效的方法可以从顶部或底部开始每行将矩阵移动一列? 例如,请考虑以下矩阵: [,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
