You can use the package ShiftedArrays
.
using DataFrames
import ShiftedArrays: lag
# mock data
using Random; Random.seed!(1234)
dff = DataFrame(year = repeat(2017:2021, inner=5), sector = repeat(["A", "B", "C", "D", "E"],5), roa = rand(25))
# computation
sort!(dff, [:sector, :year]) # sort data by the group and year
transform!(groupby(dff,[:sector]), :roa => lag => :prev_roa) # create lag value
dff.rate_change = (dff.roa ./ dff.prev_roa .- 1 ) * 100 # create rate_change
with output
julia> dff
25×5 DataFrame
Row │ year sector roa prev_roa rate_change
│ Int64 String Float64 Float64? Float64?
─────┼────────────────────────────────────────────────────────
1 │ 2017 A 0.579862 missing missing
2 │ 2018 A 0.639562 0.579862 10.2955
3 │ 2019 A 0.566704 0.639562 -11.3918
⋮ │ ⋮ ⋮ ⋮ ⋮ ⋮
23 │ 2019 E 0.806704 0.696041 15.899
24 │ 2020 E 0.939548 0.806704 16.4674
25 │ 2021 E 0.131026 0.939548 -86.0544
19 rows omitted