2017-06-19 5 views
0

Ich versuche, zwei data.tables in R zu verbinden. Ich bin ihnen nach Namen beitreten und ich möchte Zeilen aus einer Datentabelle in die Namensgruppen eines anderen "einfügen".Einfügen von Zeilen in Gruppen beim Verbinden

So zum Beispiel: Datentabelle A hat "Namen" und "Beträge", Datentabelle B hat "Namen" und "Adressen" (aber mehr als eine Adresse pro Name). Ich möchte eine Datentabelle, die jeden Namen, die entsprechenden Adressen und eine einzelne "Menge" für jede Gruppe von Namen hat.

Ich habe versucht, "left_join" in dplyr, aber die Menge Spalte würde für jede "Adresse" Zeile dupliziert werden.

Wer hat irgendwelche Ideen? Vielen Dank.

Beispiel Bild (Verbindungs ​​Tabelle 1 und 2 3 erstellen):

oder auch wie folgt aus:

EDIT: Hinzugefügt ein reproduzierbares Beispiel dafür, was die beiden Datensätze sind wie und was der gewünschte Ausgang ist

table_one <- data.frame(name=c("x","y","z"), amount=c("$100","200","300")) 
table_two <- data.frame(name=c("x","x","y","z","z","z"), address=c("A","B","C","D","E","F")) 

output <- data.frame(name=c("x","x","y","z","z","z"), 
        address=c("A","B","C","D","E","F"), amount=c("$100","","$200","$300","","")) 
+2

Es ist besser, ein [reproduzierbares Beispiel] schließen (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproduzierbar-Beispiel) mit Beispiel-Eingabedaten in einer Form, die wir kopieren/einfügen können. Bilder von Daten sind nicht hilfreich. – MrFlick

+0

Tabelle 3 ähnelt mehr der Zeilenbindung als dem Verbinden mit mir. Vielleicht 'bind_rows'? – aosmith

Antwort

1

dplyr Verwendung,

library(dplyr) 

left_join(table_two, table_one, by = 'name') %>% 
    mutate(amount = replace(amount, duplicated(name), NA)) 
# name address amount 
#1 x  A $100 
#2 x  B <NA> 
#3 y  C 200 
#4 z  D 300 
#5 z  E <NA> 
#6 z  F <NA> 
0

Hier gehen Sie.

table_one <- data.frame(name=c("x","y","z"), amount=c("$100","$200","$300")) 
table_two <- data.frame(name=c("x","x","y","z","z","z"), address=c("A","B","C","D","E","F")) 

output <- data.frame(name=c("x","x","y","z","z","z"), 
        address=c("A","B","C","D","E","F"), amount=c("$100","","$200","$300","","")) 


test <- merge(table_one, table_two, by = 'name') 
test$amount <- as.character(test$amount) 
test$amount[duplicated(test[,c(1,2)])] <- "" 
test 
0

Wir können dies tun, mit match

i1 <- with(table_one, match(name, table_two$name)) 
table_two$amount <- "" 
table_two$amount[i1] <- as.character(table_one$amount) 
table_two 
# name address amount 
#1 x  A $100 
#2 x  B  
#3 y  C 200 
#4 z  D 300 
#5 z  E  
#6 z  F  
Verwandte Themen