desde formato ancho a formato largo con resultados en varias columnas [duplicado]

Esta pregunta ya tiene una respuesta aquí:

Combine múltiples columnas en datos ordenados [duplicado] 3 respuestasReformar múltiples conjuntos de columnas de medición (formato ancho) en columnas individuales (formato largo) 6 respuestas

Tengo datos que se parecen al siguiente marco de datos, pero cada combo tiene unos diez campos, comenzando con nombre1, dirección1, ciudad1, etc.

   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>  

Ahora me gustaría reorganizar esta información para que sea un poco más útil y debería ser así, pero con la información de la que proviene:

      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     

Utilizando tidyr puedo obtener un formato largo, pero luego tengo una columna de clave que contiene todos los nombres de variables, nombre1, nombre2, nombre3, calle1, etc.

I al, así que intenté usar marcos de datos separados, uno para cada combinación, p. un marco de datos para los nombres, uno para las calles, etc. Pero unir todo nuevamente da como resultado registros incorrectos, porque solo puede unirse en la identificación y en un formato largo esta ID se replica. También he estado investigando Reshape2, pero eso resulta en el mismo problema.

Todas las conversiones de ancho a largo que he visto son cuando tiene una columna a la que desea convertir. Estoy buscando el resultado final en 10 columnas, o como en el ejemplo 2 columnas.

¿Hay una función que estoy pasando por alto?

#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


                   )

Respuestas a la pregunta(1)

Su respuesta a la pregunta