от широкого формата к длинному формату с результатами в нескольких столбцах [дубликаты]
На этот вопрос уже есть ответ:
Объединить несколько столбцов в аккуратные данные [дубликаты] 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
)