Реструктурируйте данные с несколькими строками имен столбцов из широких в длинные

Я продолжаю извлекать данные из Eikon в следующем формате:

structure(list(GB0002404191 = c("DATE", "30/12/2022", "29/12/2022", 
"28/12/2022", "23/12/2022", "22/12/2022", "21/12/2022", "20/12/2022", 
"19/12/2022", "16/12/2022"), GB0002404191 = c("HIGH", "112.165", 
"112.127", "112.088", "112.41", "112.767", "112.712", "112.867", 
"113.963", "114.324"), GB0002404191 = c("LOW", "111.741", "111.821", 
"111.453", "111.943", "112.064", "112.36", "112.203", "113.046", 
"113.618"), GB0004893086 = c("DATE", "30/12/2022", "29/12/2022", 
"28/12/2022", "23/12/2022", "22/12/2022", "21/12/2022", "20/12/2022", 
"19/12/2022", "16/12/2022"), GB0004893086 = c("HIGH", "104.689", 
"104.879", "104.724", "105.353", "105.678", "105.606", "105.785", 
"107.244", "107.777"), GB0004893086 = c("LOW", "104.145", "104.21", 
"103.849", "104.653", "104.756", "105.002", "104.683", "105.955", 
"106.742"), GB0008932666 = c("DATE", "30/12/2022", "29/12/2022", 
"28/12/2022", "23/12/2022", "22/12/2022", "21/12/2022", "20/12/2022", 
"19/12/2022", "16/12/2022"), GB0008932666 = c("HIGH", "336.582", 
"337.641", "336.927", "337.308", "336.603", "336.053", "336.624", 
"341.35", "341.563"), GB0008932666 = c("LOW", "334.827", "335.018", 
"333.571", "334.383", "335.119", "334.512", "333.98", "337.689", 
"339.277"), GB0008983024 = c("DATE", "30/12/2022", "29/12/2022", 
"28/12/2022", "23/12/2022", "22/12/2022", "21/12/2022", "20/12/2022", 
"19/12/2022", "16/12/2022")), row.names = c(NA, -10L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x5649696b0a00>)

Имена столбцов являются идентификаторами, а первая строка данных содержит имена вложенных столбцов.

Я хочу изменить данные в следующем формате:

Где каждая группа (идентификатор) накладывается друг на друга, а значения — это столбцы рядом с ней.

Когда я смотрю на это решение Изменение формы data.frame из широкого в длинный формат Я вижу, что проблема с моими данными заключается в том, что у меня нет четко определенных id.vars, как у них. Мои идентификаторы vars - это первая строка (а не какой-то набор столбцов).

Может кто-нибудь посоветовать, как я могу получить желаемую форму данных.

Я видел это, но моя форма данных отличается. Например, как мне выбрать id.vars? Мой id.vars - первая строка. Как я могу указать это?

Jef van Cappellen 07.02.2023 16:12

Прочтите это: tidyr.tidyverse.org/reference/pivot_longer.html это все объясняет.

Paul Stafford Allen 07.02.2023 16:15

Все ваши данные были прочитаны как символьные значения, потому что у вас есть две строки заголовков. Это, вероятно, вызовет проблемы. Было бы лучше сначала правильно импортировать данные с числовыми значениями, сначала обработав двойной заголовок.

MrFlick 07.02.2023 16:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В основном у вас есть два набора имен столбцов. Вам нужно будет свернуть их только в один набор имен столбцов, а затем вы можете повернуть, как обычно, например. используя tidyr::pivot_wider(). Включение имен столбцов в первую строку данных также приводит к тому, что все столбцы становятся символьными; вы можете использовать type.convert() или readr::type_convert() для приведения к соответствующему типу.

library(tidyr)
library(readr)

cols1 <- names(dat)     # first set of column names
cols2 <- dat[1, ]       # second set of column names
dat2 <- dat[-1, ]       # actual data

# rename data with one collapsed set of column names
names(dat2) <- paste(cols1, cols2, sep = "_") 

# pivot and change column types
dat2 %>%
  pivot_longer(
    everything(),
    names_to = c("ID", ".value"),
    names_sep = "_"
  ) %>%
  type_convert(col_types = cols(DATE = col_date("%d/%m/%Y")))
# A tibble: 36 × 4
   ID           DATE        HIGH   LOW
   <chr>        <date>     <dbl> <dbl>
 1 GB0002404191 2022-12-30  112.  112.
 2 GB0004893086 2022-12-30  105.  104.
 3 GB0008932666 2022-12-30  337.  335.
 4 GB0008983024 2022-12-30   NA    NA 
 5 GB0002404191 2022-12-29  112.  112.
 6 GB0004893086 2022-12-29  105.  104.
 7 GB0008932666 2022-12-29  338.  335.
 8 GB0008983024 2022-12-29   NA    NA 
 9 GB0002404191 2022-12-28  112.  111.
10 GB0004893086 2022-12-28  105.  104.
# … with 26 more rows

Другие вопросы по теме