Titre compliqué mais voici un exemple simple de ce que j'essaie de réaliser:
d <- data.frame(v1 = c(1,2,3,4,5,6,7,8),
v2 = c("A","E","C","B","B","C","A","E"))
m <- data.frame(v3 = c("D","E","A","C","D","B"),
v4 = c("d","e","a","c","d","b"))
Les valeurs dans d$v2
Doivent être remplacées par des valeurs dans m$v4
En faisant correspondre les valeurs de d$v2
Dans m$v3
Le bloc de données résultant d
devrait ressembler à:
v1 v4
1 a
2 e
3 c
4 b
5 b
6 c
7 a
8 e
J'ai essayé des trucs différents et le plus proche est venu: d$v2 <- m$v4[which(m$v3 %in% d$v2)]
J'essaye d'éviter à nouveau les boucles for! Doit être possible :-) en quelque sorte ...;)
Tu pourrais essayer:
merge(d,m, by.x="v2", by.y="v3")
v2 v1 v4
1 A 1 a
2 A 7 a
3 B 4 b
4 B 5 b
5 C 3 c
6 C 6 c
7 E 2 e
8 E 8 e
Voici une autre approche, pour conserver l'ordre:
data.frame(v1=d$v1, v4=m[match(d$v2, m$v3), 2])
v1 v4
1 1 a
2 2 e
3 3 c
4 4 b
5 5 b
6 6 c
7 7 a
8 8 e
Vous pouvez utiliser une jointure gauche standard.
Chargement des données:
d <- data.frame(v1 = c(1,2,3,4,5,6,7,8), v2 = c("A","E","C","B","B","C","A","E"), stringsAsFactors=F)
m <- data.frame(v3 = c("D","E","A","C","D","B"), v4 = c("d","e","a","c","d","b"), stringsAsFactors=F)
Modification du nom de la colonne, de sorte que je puisse rejoindre par la colonne "v2"
colnames(m) <- c("v2", "v4")
Gauche rejoindre et maintenir l'ordre de data.frame d
library(dplyr)
left_join(d, m)
Production:
v1 v2 v4
1 1 A a
2 2 E e
3 3 C c
4 4 B b
5 5 B b
6 6 C c
7 7 A a
8 8 E e
Cela vous donnera la sortie souhaitée:
d$v2 <- m$v4[match(d$v2, m$v3)]
la fonction match renvoie la position de la colonne v3 de la matrice m pour les valeurs de d$v2
mises en correspondance. Une fois que vous avez obtenu les indices (en utilisant match()
), accédez aux éléments de m$v4
En utilisant ces indices pour remplacer les éléments dans la matrice d, colonne v2.