1
votes

Remplacer les valeurs d'une matrice par des valeurs d'une autre

Je suis un débutant en programmation essayant de comparer deux matrices. Dans le cas où un élément de la première colonne de mat1 correspond à n'importe quel élément de la première colonne de mat2, alors je veux que l'élément correspondant dans mat1 soit remplacé par le neighboor (même ligne, colonne différente) à la correspondance dans mat2.

INPUT:

> for(x in mat1){mat3<-ifelse(x==mat2,mat2[which(x==mat2),2],mat1)}
> mat3
     [,1] [,2]
[1,] "a"  "a" 
[2,] "2"  "b" 
[3,] "c"  "c" 
[4,] "d"  "d" 
[5,] "e"  "e" 

souhaité OUTPUT:

> mat3
     [,1]
[1,] "a" 
[2,] "b" 
[3,] "c" 
[4,] "1" 
[5,] "2" 

J'ai tenté ce qui suit sans réussir:

mat1<-matrix(letters[1:5])
mat2<-cbind(letters[4:8],1:5)

> mat1
     [,1]
[1,] "a" 
[2,] "b" 
[3,] "c" 
[4,] "d" 
[5,] "e" 

> mat2
     [,1] [,2]
[1,] "d"  "1" 
[2,] "e"  "2" 
[3,] "f"  "3" 
[4,] "g"  "4" 
[5,] "h"  "5" 

Tout conseil sera très apprécié. Avoir passé une journée entière sans que ça marche. Peu m'importe si les éléments sont dans une matrice ou un bloc de données.

Merci.


0 commentaires

3 Réponses :


2
votes

ifelse est vectorisé donc, nous pouvons l'utiliser sur toute la colonne. Créez la condition logique test dans ifelse en vérifiant si les valeurs de la première colonne de 'mat1' sont % en% la première colonne de 'mat2' , puis, récupérez l'index des valeurs correspondantes avec match , extrayez les valeurs de la deuxième colonne avec cet index, ou bien retournez la première colonne de 'mat1'

mat3 <- matrix(ifelse(mat1[,1] %in% mat2[,1],
         mat2[,2][match(mat1[,1], mat2[,1])], mat1[,1]))
mat3
#     [,1]
#[1,] "a" 
#[2,] "b" 
#[3,] "c" 
#[4,] "1" 
#[5,] "2" 


0 commentaires

1
votes

Voici une autre solution de base R

> mat3
     [,1]
[1,] "a" 
[2,] "b" 
[3,] "c" 
[4,] "1" 
[5,] "2" 

qui donne

v <- `names<-`(mat2[,2],mat2[,1])
mat3 <- matrix(unname(ifelse(is.na(v[mat1]),mat1,v[mat1])))


1 commentaires

Une solution plus avancée. Merci beaucoup Thomas.



1
votes

Une option utilisant simplement une opération logique plutôt qu'une fonction

mat3 <- mat1
mat3[mat1[,1] %in% mat2[,1], 1] <- mat2[mat2[,1] %in% mat1[,1], 2]

Sous-regroupement des valeurs pour trouver celles qui se produisent dans les deux et les remplacer là où elles se trouvent


1 commentaires

Solution magnifiquement simple. J'essayais initialement de le faire, mais j'ai échoué. Merci beaucoup.