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.
3 Réponses :
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"
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])))
Une solution plus avancée. Merci beaucoup Thomas.
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
Solution magnifiquement simple. J'essayais initialement de le faire, mais j'ai échoué. Merci beaucoup.