Instructions

1) Import the data

stock_df <- read_csv("stock_df.csv", show_col_types = FALSE)

# Show the data (like the PDF example)
stock_df

2) Retrieve the full column specification with spec()

spec(stock_df)
## cols(
##   company = col_character(),
##   `2019_week1` = col_double(),
##   `2019_week2` = col_double(),
##   `2019_week3` = col_double(),
##   `2019_week4` = col_double(),
##   `2019_week5` = col_double(),
##   `2019_week6` = col_double(),
##   `2019_week7` = col_double(),
##   `2019_week8` = col_double(),
##   `2019_week9` = col_double(),
##   `2019_week10` = col_double(),
##   `2019_week11` = col_double(),
##   `2019_week12` = col_double(),
##   `2019_week13` = col_double(),
##   `2019_week14` = col_double(),
##   `2019_week15` = col_double(),
##   `2019_week16` = col_double(),
##   `2019_week17` = col_double(),
##   `2019_week18` = col_double(),
##   `2019_week19` = col_double(),
##   `2019_week20` = col_double(),
##   `2019_week21` = col_double(),
##   `2019_week22` = col_double(),
##   `2019_week23` = col_double(),
##   `2019_week24` = col_double(),
##   `2019_week25` = col_double(),
##   `2019_week26` = col_double(),
##   `2019_week27` = col_double(),
##   `2019_week28` = col_double(),
##   `2019_week29` = col_double(),
##   `2019_week30` = col_double(),
##   `2019_week31` = col_double(),
##   `2019_week32` = col_double(),
##   `2019_week33` = col_double(),
##   `2019_week34` = col_double(),
##   `2019_week35` = col_double(),
##   `2019_week36` = col_double(),
##   `2019_week37` = col_double(),
##   `2019_week38` = col_double(),
##   `2019_week39` = col_double(),
##   `2019_week40` = col_double(),
##   `2019_week41` = col_double(),
##   `2019_week42` = col_double(),
##   `2019_week43` = col_double(),
##   `2019_week44` = col_double(),
##   `2019_week45` = col_double(),
##   `2019_week46` = col_double(),
##   `2019_week47` = col_double(),
##   `2019_week48` = col_double(),
##   `2019_week49` = col_double(),
##   `2019_week50` = col_double(),
##   `2019_week51` = col_double(),
##   `2019_week52` = col_double(),
##   `2020_week1` = col_double(),
##   `2020_week2` = col_double(),
##   `2020_week3` = col_double(),
##   `2020_week4` = col_double(),
##   `2020_week5` = col_double(),
##   `2020_week6` = col_double(),
##   `2020_week7` = col_double(),
##   `2020_week8` = col_double(),
##   `2020_week9` = col_double(),
##   `2020_week10` = col_double(),
##   `2020_week11` = col_double(),
##   `2020_week12` = col_double(),
##   `2020_week13` = col_double(),
##   `2020_week14` = col_double(),
##   `2020_week15` = col_double(),
##   `2020_week16` = col_double(),
##   `2020_week17` = col_double(),
##   `2020_week18` = col_double(),
##   `2020_week19` = col_double(),
##   `2020_week20` = col_double(),
##   `2020_week21` = col_double(),
##   `2020_week22` = col_double(),
##   `2020_week23` = col_double(),
##   `2020_week24` = col_double(),
##   `2020_week25` = col_double(),
##   `2020_week26` = col_double(),
##   `2020_week27` = col_double(),
##   `2020_week28` = col_double(),
##   `2020_week29` = col_double(),
##   `2020_week30` = col_double(),
##   `2020_week31` = col_double(),
##   `2020_week32` = col_double(),
##   `2020_week33` = col_double(),
##   `2020_week34` = col_double(),
##   `2020_week35` = col_double(),
##   `2020_week36` = col_double(),
##   `2020_week37` = col_double(),
##   `2020_week38` = col_double(),
##   `2020_week39` = col_double(),
##   `2020_week40` = col_double(),
##   `2020_week41` = col_double(),
##   `2020_week42` = col_double(),
##   `2020_week43` = col_double(),
##   `2020_week44` = col_double(),
##   `2020_week45` = col_double(),
##   `2020_week46` = col_double(),
##   `2020_week47` = col_double(),
##   `2020_week48` = col_double(),
##   `2020_week49` = col_double(),
##   `2020_week50` = col_double(),
##   `2020_week51` = col_double(),
##   `2020_week52` = col_double(),
##   `2020_week53` = col_double()
## )

3) Reshape from wide to long (stock_df_long)

The columns are like: 2019_week1, 2019_week2, …
We reshape to: company, year, week, price.

IMPORTANT: In R strings, regex backslashes must be escaped.
That’s why you’ll see \\d below.

stock_df_long <- stock_df %>%
  pivot_longer(
    cols = -company,
    names_to = c("year", "week"),
    names_pattern = "(\\d{4})_week(\\d+)",
    values_to = "price"
  ) %>%
  mutate(
    year = as.integer(year),
    week = as.integer(week)
  ) %>%
  arrange(company, year, week)

stock_df_long

Quick checks

# Should be 5 companies x 105 weeks = 525 rows, and 4 columns
dim(stock_df_long)
## [1] 525   4
# First 10 rows
head(stock_df_long, 10)

(Optional) Visualization: weekly closing prices in 2019

stock_2019 <- stock_df_long %>% filter(year == 2019)

ggplot(stock_2019, aes(x = week, y = price, color = company)) +
  geom_line(linewidth = 1) +
  labs(
    title = "Weekly Closing Prices (2019)",
    x = "Week",
    y = "Closing price"
  ) +
  theme_minimal()