от широкого формата к длинному формату с результатами в нескольких столбцах [дубликаты]

На этот вопрос уже есть ответ:

Объединить несколько столбцов в аккуратные данные [дубликаты] 3 ответа Преобразование нескольких наборов столбцов измерений (широкий формат) в отдельные столбцы (длинный формат) 6 ответов

У меня есть данные, которые выглядят как следующий фрейм данных, но каждая комбинация имеет около десяти полей, начиная с name1, adress1, city1 и т. Д.

   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>  

Теперь я хотел бы изменить эти данные, чтобы они были немного более полезными и выглядели так, но с информацией, из которой они поступили:

      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     

Используя tidyr, я могу получить длинный формат, но тогда у меня есть ключевой столбец, который содержит все имена переменных, name1, name2, name3, street1 и т. Д.

Я, поэтому попытался использовать отдельные кадры данных, по одному для каждой комбинации, например, один фрейм данных для имен, один для улиц и т. д. Но тогда объединение всего воедино приведет к неправильным записям, потому что вы можете объединиться только по идентификатору, и в длинном формате этот идентификатор реплицируется. Я также искал Reshape2, но это приводит к той же проблеме.

Все преобразования ширины в длину, которые я видел, - это когда у вас есть один столбец, в который вы хотите преобразовать. Я ищу конечный результат в 10 столбцах, или как в примере 2 столбца.

Есть ли функция, которую я пропускаю?

#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


                   )

Ответы на вопрос(1)

Ваш ответ на вопрос