vom Breit- zum Langformat mit Ergebnissen in mehreren Spalten [duplizieren]

Diese Frage hat hier bereits eine Antwort:

Kombinieren Sie mehrere Spalten zu ordentlichen Daten [duplizieren] 3 answersMehrere Sätze von Messspalten (Breitformat) in einzelne Spalten (Langformat) umformen 6 answers

Ich habe Daten, die wie folgt aussehen, aber jede Kombination enthält ungefähr zehn Felder, beginnend mit name1, adresse1, stadt1 usw.

   id name1  adress1 name2  adress2  name3  adress3
1  1  John street a  Burt street d  chris street 1
2  2  Jack street b   Ben street e connor street 2
3  3  Joey     <NA>   Bob street f   <NA>     <NA>  

Nun möchte ich diese Daten neu anordnen, damit sie ein bisschen nützlicher sind und so aussehen, aber mit der Information, von welchem Eintrag sie stammen:

      id origin  names adresses
1  1      1   John street a
2  2      1   Jack street b
3  3      1   Joey     <NA>
4  1      2   Burt street d
5  2      2    Ben street e
6  3      2    Bob street f
7  1      3  chris street 1
8  2      3 connor street 2     

Mit tidyr kann ich ein langes Format erhalten, aber dann habe ich eine Schlüsselspalte, die alle Variablennamen, name1, name2, name3, street1 usw. enthält.

ch habe auch versucht, separate Datenrahmen zu verwenden, einen für jede Kombination, z. Ein Datenrahmen für die Namen, ein Datenrahmen für die Straßen usw. Wenn Sie jedoch alles wieder zusammenfügen, werden die falschen Datensätze erstellt, da Sie nur eine ID hinzufügen können und diese ID in einem langen Format repliziert wird. Ich habe mich auch mit Reshape2 befasst, aber das führt zu demselben Problem.

Alle Conversions von wide zu long, die ich gesehen habe, sind, wenn Sie eine Spalte haben, in die Sie konvertieren möchten. Ich suche das Endergebnis in 10 Spalten, oder wie im Beispiel 2 Spalten.

Gibt es eine Funktion, die ich übersehen habe?

#code to generete the dataframes:
df <- data.frame(id = c(1,2,3), 
                 name1 = c("John", "Jack", "Joey"), 
                 adress1 = c("street a", "street b", NA), 
                 name2 = c("Burt", "Ben", "Bob"),
                 adress2 = c("street d", "street e", "street f"),
                 name3 = c("chris", "connor", NA),
                 adress3 = c("street 1", "street 2", NA),
                 stringsAsFactors = FALSE)


expecteddf <- data.frame(id = c(1,2,3,1,2,3,1,2), 
                         origin = c(rep(1, 3), rep(2, 3), rep(3, 2)), 
                         names = c("John", "Jack", "Joey", "Burt", "Ben", "Bob", "chris", "connor"), 
                         adresses = c("street a", "street b", NA, "street d", "street e", "street f", "street 1", "street 2"),
                         stringsAsFactors = FALSE


                   )

Antworten auf die Frage(2)

Ihre Antwort auf die Frage