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!
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
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)
);
je pense que la suite devrait fonctionner :
library(data.table)
setkey(link,wpt)
setkey(body,wpt)
merge(link,body,by="wpt",all.x=T)
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