N <- 10
    df <- data.frame(cell=1:N,per_2001=rnorm(N),per_2002=rnorm(N),hus_2001=rnorm(N),hus_2002=rnorm(N))

    # using data.table
    library(data.table)
## Warning: package 'data.table' was built under R version 4.0.5
    dt <- as.data.table(df)
    melt(dt,measure.vars=list(c(2,3),c(4,5)))
    # using 'reshape' from stats (included in base R)
    stats::reshape(df,varying=list(c(2,3),c(4,5)),direction='long')
    # using 'pivot_longer' from tidyr package
    library(tidyr)
## Warning: package 'tidyr' was built under R version 4.0.5
    df <- data.frame(cell=1:N,per2001=rnorm(N),per2002=rnorm(N),hus2001=rnorm(N),hus2002=rnorm(N))
    pivot_longer(df,cols=2:5,names_pattern='([a-z][a-z][a-z])([0-9][0-9][0-9][0-9])',names_to=c("type","year"))
    df <- data.frame(cell=1:N,per2001=rnorm(N),per2002=rnorm(N),hus2001=rnorm(N),hus2002=rnorm(N))
    pivot_longer(df,cols=2:5,names_pattern='([a-z][a-z][a-z])([0-9][0-9][0-9][0-9])',names_to=c(".value","year"))
    df <- data.frame(cell=1:N,per_2001=rnorm(N),per_2002=rnorm(N),hus_2001=rnorm(N),hus_2002=rnorm(N))
    pivot_longer(df,cols=2:5,names_sep='_',names_to=c("type","year"))
    df <- data.frame(cell=1:N,per_2001=rnorm(N),per_2002=rnorm(N),hus_2001=rnorm(N),hus_2002=rnorm(N))
    pivot_longer(df,cols=2:5,names_sep='_',names_to=c(".value","year"))