Я много просматривал Интернет, но до сих пор не нашел подходящего ответа на свой вопрос в этом конкретном случае.
Я ищу частично реструктурировать набор данных панели из длинного в широкий формат, но только для определенных значений, которые указаны их соответствующими именами/символами в строках в R.
Рассмотрим этот оригинальный формат:
SERIES ECONOMY YEAR Value
246 CPI Panama 1960 0.05
247 CPI Peru 1960 0.05
248 CPI XXXXXX 1960 0.05
249 CPI Panama 1961 0.06
250 CPI Peru 1961 0.06
251 CPI XXXXXX 1961 0.06
252 % Gross savings Panama 1960 5
253 % Gross savings Peru 1960 6
254 % Gross savings XXXXXX 1960 7
255 % Gross savings Panama 1961 20
256 % Gross savings Peru 1961 21
257 % Gross savings XXXXXX 1961 22
(И так далее по разным странам, разные показатели в столбце "СЕРИЯ", в течение 1960-2020 гг. по каждой стране и показателю.)
Я хочу сохранить «ЭКОНОМИКА» в качестве отдельного столбца, указывающего страну в том виде, в котором она была изначально видна, также сохранить год в виде столбца, но переместить каждый отдельный показатель в СЕРИИ (например, ИПЦ /% валовых сбережений) в свои собственные столбцы, подобные этому. :
ECONOMY YEAR CPI %_GROSS_SAVINGS
1 Panama 1960 0.05 5
2 Peru 1960 0.05 6
3 XXXXXX 1960 0.05 7
4 Panama 1961 0.06 20
5 Peru 1961 0.06 21
6 XXXXXX 1961 0.06 22
Любые идеи? Благодарен за ответы.
Не уверен, что я следую - мне кажется, что это типичное использование pivot_wider
:
library(tidyr)
dat |> pivot_wider(names_from = "SERIES",
values_from = "Value")
#> # A tibble: 6 x 4
#> ECONOMY YEAR CPI `% Gross savings`
#> <chr> <dbl> <dbl> <dbl>
#> 1 Panama 1960 0.05 5
#> 2 Peru 1960 0.05 6
#> 3 XXXXXX 1960 0.05 7
#> 4 Panama 1961 0.06 20
#> 5 Peru 1961 0.06 21
#> 6 XXXXXX 1961 0.06 22
Created on 2022-04-08 by the reprex package (v2.0.0)
Воспроизводимые данные:
dat <- structure(list(SERIES = c("CPI", "CPI", "CPI", "CPI", "CPI",
"CPI", "% Gross savings", "% Gross savings", "% Gross savings",
"% Gross savings", "% Gross savings", "% Gross savings"), ECONOMY = c("Panama",
"Peru", "XXXXXX", "Panama", "Peru", "XXXXXX", "Panama", "Peru",
"XXXXXX", "Panama", "Peru", "XXXXXX"), YEAR = c(1960, 1960, 1960,
1961, 1961, 1961, 1960, 1960, 1960, 1961, 1961, 1961), Value = c(0.05,
0.05, 0.05, 0.06, 0.06, 0.06, 5, 6, 7, 20, 21, 22)), row.names = c(NA,
-12L), class = c("tbl_df", "tbl", "data.frame"))
reshape2::dcast(ECONOMY + YEAR ~ SERIES, data = zz)
# Using Value as value column: use value.var to override.
# ECONOMY YEAR %_Gross_savings CPI
# 1 Panama 1960 5 0.05
# 2 Panama 1961 20 0.06
# 3 Peru 1960 6 0.05
# 4 Peru 1961 21 0.06
# 5 XXXXXX 1960 7 0.05
# 6 XXXXXX 1961 22 0.06
Данные
zz <- structure(list(SERIES = c("CPI", "CPI", "CPI", "CPI", "CPI", "CPI", "%_Gross_savings", "%_Gross_savings", "%_Gross_savings", "%_Gross_savings", "%_Gross_savings", "%_Gross_savings"), ECONOMY = c("Panama", "Peru", "XXXXXX", "Panama", "Peru", "XXXXXX", "Panama", "Peru", "XXXXXX", "Panama", "Peru", "XXXXXX"), YEAR = c(1960L, 1960L, 1960L, 1961L, 1961L, 1961L, 1960L, 1960L, 1960L, 1961L, 1961L, 1961L), Value = c(0.05, 0.05, 0.05, 0.06, 0.06, 0.06, 5, 6, 7, 20, 21, 22)), class = "data.frame", row.names = c("246", "247", "248", "249", "250", "251", "252", "253", "254", "255", "256", "257"))
Спасибо за вашу помощь и очень быстрый ответ. Приведенная ниже функция reshape2::dcast сделала это за меня. Хорошего дня!