0

How should I code in R if I make the left structure to the right one?

enter image description here

enter image description here

fedora
  • 19
  • 3
  • 2
    Welcome to Stack Overflow. What have you tried so far? Can you please post your input and output in a textual form (e.g. cut-and-pasted text in a code format) rather than as an image? Images are un-searchable and inaccessible to people using screen readers ... – Ben Bolker Mar 11 '22 at 23:17
  • 2
    Welcome to the community! Check it out: [making R reproducible questions](https://stackoverflow.com/q/5963269). – Kat Mar 12 '22 at 00:25

2 Answers2

1

If you are starting with a data.frame like this:

df <- data.frame(
  wave = c("2019-2021", "2022-2024"),
  a = 3:4,
  b = 5:6
)

df
       wave a b
1 2019-2021 3 5
2 2022-2024 4 6

Then, with tidyverse you can extract the numeric years from the wave column and create a sequence of years from those two years.

library(tidyverse)

df %>%
  mutate(years = map(
    str_extract_all(wave, "\\d{4}"),
    ~as.numeric(.x[1]):as.numeric(.x[2])
  )) %>% 
  unnest_longer(years)

Output

  wave          a     b years
  <chr>     <int> <int> <int>
1 2019-2021     3     5  2019
2 2019-2021     3     5  2020
3 2019-2021     3     5  2021
4 2022-2024     4     6  2022
5 2022-2024     4     6  2023
6 2022-2024     4     6  2024
Ben
  • 28,684
  • 5
  • 23
  • 45
1

Here's another tidyverse option -

library(tidyverse)

df %>%
  separate(wave, c('start', 'end'), sep = '-', convert = TRUE,remove = FALSE) %>%
  mutate(year = map2(start, end, seq)) %>%
  unnest(year) %>%
  select(wave, year, a, b)

#  wave       year     a     b
#  <chr>     <int> <int> <int>
#1 2019-2021  2019     3     5
#2 2019-2021  2020     3     5
#3 2019-2021  2021     3     5
#4 2022-2024  2022     4     6
#5 2022-2024  2023     4     6
#6 2022-2024  2024     4     6
Ronak Shah
  • 377,200
  • 20
  • 156
  • 213