2013-07-20 5 views
2

J'ai déjà posé cette question et j'ai reçu de l'aide. Cependant, je ne suis toujours pas capable d'effectuer ce que je voudrais. Je pense que c'est parce que je n'ai pas expliqué ce que je voudrais bien faire. Donc, je voudrais essayer à nouveau.Fusion de bases de données sur 2 colonnes, un nom et un nombre approximatif

Voici ce que j'aimerais faire. J'ai 2 ensembles de données

Data Set A

Name Number ValueA 
1: A 125 16 
2: B 1735 76 
3: C 2985 22 
4: D 3245 76 
5: E 4211 22 

Data Set B

Name Number ValueB 
1: A 127 56 
2: B 1789 84 
3: C 2990 11 
4: D 3247 36 
5: F 4293 49 

Je voudrais fusionner ces 2 données ensemble de base sur les colonnes de nom et le numéro, mais le nombre doit seulement être approximativement dans une plage définie par l'utilisateur. Par exemple: J'aimerais fusionner si le nombre est + - 10 (juste un exemple) l'un de l'autre. Dans l'ensemble de données A, le nom est A et le numéro est 125 Dans l'ensemble de données B, le nom est A et le nombre est 127 (qui est + -10 sur 125)

Pour l'entrée 2 est différent Nom est B sur les deux, mais les chiffres ne sont pas + -10 de l'autre

Table fusionné:

Name Number ValueA ValueB 
1: A 125  16  56 
2: B 1735  76  NA 
3: B 1789  NA 150 
4: C 2985  22  11 
5: D 3245  76  36 
6: E 4211  22  NA 
7: F 4293  NA  49 

Toute aide sont grandement appréciés. Je vous remercie.

+0

J'ai essayé quelque chose comme ceci: fusion (A, B, par = c (si (abs (un numéro B $ $ Nombre) <10) { "Name"} else { "Rt1"}), all = TRUE) bien sûr, cela n'a pas fonctionné ... je me demandais juste si certaines modifications sont apportées à la recommandation ci-dessus, cela fonctionnerait-il? – TCW

+0

Il ne semble pas que votre numéro dans l'ensemble A corresponde réellement à votre numéro dans l'ensemble B pour les noms A, C ou D. . –

Répondre

0

Ce n'est pas beau, mais il réalise ce que je pense que vous êtes après. Il suppose que vos données sont dans les données A et B.

M <- merge(A, B, by="Name") 
M$test <- abs(M$Number.x - M$Number.y) < 10 # Hard-coded difference 
M.y <- M[!M$test,] 
M.y$ValueA <- NA 
M.y$Number.x <- M.y$Number.y 
M$ValueB[!M$test] <- NA 
M <- rbind(M, M.y) 
M$test <- NULL 
M$Number.y <- NULL 
rm(M.y) 
names(M)[names(M)=="Number.x"] <- "Number" 
M <- M[order(M$Number), ] 
Questions connexes