de formato amplo para formato longo com resultados em várias colunas [duplicado]

Esta pergunta já tem uma resposta aqui:

Combine várias colunas em dados organizados [duplicado] 3 respostasFormatar vários conjuntos de colunas de medição (formato amplo) em colunas únicas (formato longo) respostas

Tenho dados que se parecem com o seguinte quadro de dados, mas cada combinação tem cerca de dez campos, começando com nome1, endereço1, cidade1, 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>  

Agora eu gostaria de reorganizar esses dados para que sejam um pouco mais úteis e pareçam com isso, mas com as informações de onde vieram:

      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     

Usando o tidyr, posso obter um formato longo, mas tenho uma coluna de chave que contém todos os nomes de variáveis, nome1, nome2, nome3, rua1 et

Tentei usar quadros de dados separados, um para cada combinação, por exemplo um quadro de dados para os nomes, outro para as ruas, etc. Mas, em seguida, juntar tudo novamente resulta em registros incorretos, porque você pode ingressar apenas no id e, em um formato longo, esse ID é replicado. Também estive pesquisando o Reshape2, mas isso resulta no mesmo problem

Todas as conversões de largura para comprimento que eu vi são quando você tem uma coluna na qual deseja converter. Estou procurando o resultado final em 10 colunas ou como no exemplo 2 coluna

Existe uma função que estou ignorando?

#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


                   )