У меня есть такой фрейм данных:
structure(list(...1 = c(NA, NA, "name_var1", "obs1_var1", "obs2_var1"
), ...2 = c(NA, NA, "name_var2", "obs1_var2", "obs2_var2"), ...3 = c(NA,
NA, "name_var3", "obs1_var3", "obs2_var3"), ...4 = c("Dimension",
"Subdimension", "name_var4", "obs1_var4", "obs2_var4"), ...5 = c("Dimension1",
"Subdimension1", "question1.1.1", "1", "4"), ...6 = c("Dimension1",
"Subdimension1", "question1.1.2", "3", "2"), ...5.1 = c("Dimension1",
"Subdimension2", "question1.2.1", "1", "2"), ...5.2 = c("Dimension1",
"Subdimension2", "question1.2.2", "4", "1"), ...5.3 = c("Dimension2",
"Subdimension1", "question2.1.1", "1", "4"), ...6.1 = c("Dimension2",
"Subdimension1", "question2.1.2", "3", "2"), ...5.4 = c("Dimension2",
"Subdimension2", "question2.2.1", "1", "2"), ...5.5 = c("Dimension2",
"Subdimension2", "question2.2.2", "4", "1")), class = "data.frame", row.names = c(NA,
-5L))
и я хотел бы превратиться в этот
structure(list(name_var1 = c("obs1_var1", "obs1_var1", "obs1_var1",
"obs1_var1", "obs1_var1", "obs1_var1", "obs1_var1", "obs1_var1"
), name_var2 = c("obs1_var2", "obs1_var2", "obs1_var2", "obs1_var2",
"obs1_var2", "obs1_var2", "obs1_var2", "obs1_var2"), name_var3 = c("obs1_var3",
"obs1_var3", "obs1_var3", "obs1_var3", "obs1_var3", "obs1_var3",
"obs1_var3", "obs1_var3"), name_var4 = c("obs1_var4", "obs1_var4",
"obs1_var4", "obs1_var4", "obs1_var4", "obs1_var4", "obs1_var4",
"obs1_var4"), Dimension = c("Dimension1", "Dimension1", "Dimension1",
"Dimension1", "Dimension2", "Dimension2", "Dimension2", "Dimension2"
), Subdimension = c("Subdimension1", "Subdimension1", "Subdimension2",
"Subdimension2", "Subdimension1", "Subdimension1", "Subdimension2",
"Subdimension2"), Question = c("question1.1.1", "question1.1.2",
"question1.2.1", "question1.2.2", "question2.1.1", "question2.1.2",
"question2.2.1", "question2.2.2"), Value = c(1, 3, 1, 4, 1, 3,
1, 4)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-8L))
... И продолжая все наблюдения в исходном кадре данных. есть идеи как это сделать?
Заранее спасибо за ваши комментарии и помощь.
Если вам приходится делать много подобных преобразований данных, я рекомендую пакет unpivotr
. Существует связанный пакет под названием tidyxl
, который полезен для чтения файлов Excel в необработанном виде, ячейка за ячейкой. Это может быть полезно, когда заголовки столбцов представлены в виде текста, а ячейки ниже содержат числа, даты, логические значения и т. д. Кроме того, вы даже можете использовать информацию о форматировании, которая иногда необходима для правильного извлечения информации из файла xlsx
.
Автор пакета создал бесплатную онлайн-книгу Стратегии обработки электронных таблиц, в которой рассказывается о многих ситуациях. В вашем случае вы можете использовать
library(tidyverse)
library(unpivotr)
start %>%
as_cells() %>%
behead("up", Dimension) %>%
behead("up", Subdimension) %>%
behead("up", Question) %>%
behead("left", name_var1) %>%
behead("left", name_var2) %>%
behead("left", name_var3) %>%
behead("left", name_var4) %>%
select(name_var1:name_var4, Dimension:Question, Value = chr)
где start
— ваш начальный фрейм данных. На самом деле лучше всего читать необработанный файл excel с помощью пакета tidyxl
, но это не обязательно.
Как вы получили этот формат в первую очередь?