Combiner deux bases de données avec un nombre différent de lignes dans R [dupliquer]

cette question a déjà une réponse ici:

j'ai deux bases de données, lien et corps:

lien comme ceci:

wpt        ID
1          1235
mediate    4562
mediate    0928
2          6351
3          3826
mediate    0835

corps est comme ceci:

wpt   fuel    distance
1     2221    53927
2     4821    48261
3     8362    47151

La sortie que j'attendais, c'est comme cela:

wpt      fuel   distance   ID
1        2221   53927      1235
mediate  NA     NA         4562
mediate  NA     NA         0928
2        4821   48261      6351
3        8362   47151      3826
mediate  NA     NA         0835

j'ai essayé d'utiliser la fonction" Fusionner", ça n'a pas marché. Supposons que l'utilisation du nombre de ligne de "médiate" comme index pour diviser "corps" et les rbind pièce par pièce pourrait travailler. Est-il une meilleure façon agréable? Voir quelqu'un pourrait il m'aider?

Merci d'avance!

0
demandé sur Demo 2016-06-28 05:23:05

4 réponses

df1 <- data.frame(wpt = c(1, "meditate", "meditate", 2,3,"meditate"), 
              ID = c(1235, 4562, 0928,6351,3826,0835))
df1$wpt <- as.character(df1$wpt)


df2 <- data.frame(wpt = c(1,2,3), 
              fuel = c(1235, 4562, 0928), 
              distance = c(2,3,4))
df2$wpt <- as.character(df2$wpt)


library(dplyr)
full_join(df1, df2, by = "wpt")

peu importe les valeurs! Vous pouvez toujours réarranger les colonnes.

       wpt   ID fuel distance
1        1 1235 1235        2
2 meditate 4562   NA       NA
3 meditate  928   NA       NA
4        2 6351 4562        3
5        3 3826  928        4
6 meditate  835   NA       NA
2
répondu Sumedh 2016-06-28 02:42:26

Voici une solution de base R sans fusion construite autour match() :

link[names(body)[-1L]] <- body[match(link[,1L],body[,1L]),-1L];
link;
##       wpt   ID fuel distance
## 1       1 1235 2221    53927
## 2 mediate 4562   NA       NA
## 3 mediate 0928   NA       NA
## 4       2 6351 4821    48261
## 5       3 3826 8362    47151
## 6 mediate 0835   NA       NA

Données

link <- data.frame(wpt=c('1','mediate','mediate','2','3','mediate'),ID=c('1235','4562','0928'
,'6351','3826','0835'),stringsAsFactors=F);
body <- data.frame(wpt=c(1L,2L,3L),fuel=c(2221L,4821L,8362L),distance=c(53927L,48261L,47151L)
);
3
répondu bgoldst 2016-06-30 02:36:52

je pense que la suite devrait fonctionner :

library(data.table)
setkey(link,wpt)
setkey(body,wpt)
merge(link,body,by="wpt",all.x=T)
2
répondu Koba 2016-06-28 03:12:37

nous pouvons utiliser left_join

library(dplyr)
mutate(df2, wpt = as.character(wpt)) %>% 
                  left_join(df1, ., by = 'wpt')
#      wpt   ID fuel distance
#1       1 1235 2221    53927
#2 mediate 4562   NA       NA
#3 mediate  928   NA       NA
#4       2 6351 4821    48261
#5       3 3826 8362    47151
#6 mediate  835   NA       NA

ou en utilisant data.table

library(data.table)
setDT(df2)[, wpt := as.character(wpt)][df1, on = "wpt"]
#       wpt fuel distance   ID
#1:       1 2221    53927 1235
#2: mediate   NA       NA 4562
#3: mediate   NA       NA  928
#4:       2 4821    48261 6351
#5:       3 8362    47151 3826
#6: mediate   NA       NA  835
1
répondu akrun 2016-06-28 03:04:23