Я продолжаю извлекать данные из 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 - первая строка. Как я могу указать это?
Прочтите это: tidyr.tidyverse.org/reference/pivot_longer.html это все объясняет.
Все ваши данные были прочитаны как символьные значения, потому что у вас есть две строки заголовков. Это, вероятно, вызовет проблемы. Было бы лучше сначала правильно импортировать данные с числовыми значениями, сначала обработав двойной заголовок.
В основном у вас есть два набора имен столбцов. Вам нужно будет свернуть их только в один набор имен столбцов, а затем вы можете повернуть, как обычно, например. используя 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
См. Изменение формата data.frame из широкого в длинный формат