web-dev-qa-db-fra.com

Faire correspondre les valeurs du bloc de données avec les valeurs d'un autre bloc de données et remplacer l'ancien par un modèle correspondant de l'autre bloc de données

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 ...;)

17
user969113

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

Éditer

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
18
johannes

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
10
Esben Eickhardt

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.

4
Swati Gupta