2015-10-30 3 views
0

J'ai besoin de déplacer une image (que j'ai stockée comme une matrice) haut/bas ou gauche/droite et je voudrais que cela reste dans les limites des dimensions de la matrice d'origine.Décalage de la matrice par nrow ou ncol dans R

Pour montrer un exemple, si j'avais une matrice 3x3

x <- matrix(seq(1,9),3,3) 

      [,1] [,2] [,3] 
    [1,] 1 4 7 
    [2,] 2 5 8 
    [3,] 3 6 9 

et je voulais changer ce bas que je recevrais

  [,1] [,2] [,3] 
    [1,] NA NA NA 
    [1,] 1 4 7 
    [2,] 2 5 8 

Quelqu'un pourrait me aider? Je voudrais également la possibilité d'effectuer cela pour les traductions dans la gauche/droite aussi

+0

Mis à jour avec une fonction. Veuillez vérifier si cela fonctionne pour vous. – akrun

+0

Cela fonctionne parfaitement merci, grandement apprécié! – jordanawhite

Répondre

2

Créé une fonction pour faire face à «gauche», «droite», «haut», «bas».

f1 <- function(mat, dir, n=1){ 
if(dir %in% c('up', 'down')){ 
    stopifnot(nrow(mat)> n) 
    i1 <- rep(NA, ncol(mat)) 
if(dir=='down'){ 
    r1 <- `dimnames<-`(do.call(rbind, c(replicate(n, i1, simplify=FALSE), 
           list(head(mat, -n)))), NULL) 
    } 

else { 

    r1 <- `dimnames<-`(do.call(rbind, c(list(tail(mat, -n)), 
         replicate(n, i1, simplify=FALSE))), NULL) 

    } 
    } 
else { 
    stopifnot(ncol(mat) > n) 
    i2 <- rep(NA, nrow(mat)) 
    if(dir=='right'){ 
    r1 <- `dimnames<-`(do.call(cbind, c(replicate(n, i2, simplify=FALSE), 
          list(mat[, head(1:ncol(mat),-n)]))), NULL) 
    } 
    else { 
    r1 <- `dimnames<-`(do.call(cbind, c(list(mat[,tail(1:ncol(mat), -n)]), 
         replicate(n, i2, simplify=FALSE))), NULL) 
    } 

} 
    r1 
} 

Vérification avec différents 'n' et les directions.

f1(x, 'up', 2) 
#  [,1] [,2] [,3] 
#[1,] 3 6 9 
#[2,] NA NA NA 
#[3,] NA NA NA 

f1(x, 'down',2) 
#  [,1] [,2] [,3] 
#[1,] NA NA NA 
#[2,] NA NA NA 
#[3,] 1 4 7 
f1(x, 'left',1) 
#  [,1] [,2] [,3] 
#[1,] 4 7 NA 
#[2,] 5 8 NA 
#[3,] 6 9 NA 
f1(x, 'right',1) 
#  [,1] [,2] [,3] 
#[1,] NA 1 4 
#[2,] NA 2 5 
#[3,] NA 3 6 

f1(x, 'right',3) 
#Error: ncol(mat) > n is not TRUE 

f1(x, 'up',3) 
#Error: nrow(mat) > n is not TRUE 
+0

Comment puis-je obtenir ce travail pour les quarts de travail> 1? – jordanawhite

+0

@jordanawhite Vous pouvez utiliser 'lead' ou' lag' de 'dplyr' et spécifier' n' ou 'shift' de' data.table'. Pour cela, le 'matrice' doit être converti en' data.frame/data/table' – akrun

+0

Le lead et lag fonctionneraient pour les changements de gauche et de droite mais pas pour les changements de haut en bas – jordanawhite