R: Rates of change from an initial value
You can reproduce both of your desired outputs using dplyr. I don't know how you were trying to use lag, but one solution is to have mutate create dummy columns that you will remove at the end. 

df %&gt;%                                            # Set up the pipe
arrange(Group, Year) %&gt;%                         # Ensures the data are in ascending order 
group_by(Group) %&gt;%                              # Group by 'Group'
mutate(lag = lag(Data),                          # Create a dummy column 'lag'
     RateOfChange = (Data - lag) * 100 / lag,    # Calculate RateOfChange
     First = head(Data, 1),                      # Dummy column for the frist yearly value by group
     BaselineChange =                            # Calculate BaselineChange     
       case_when(Data != First ~ (Data - First) * 100 / First,
                 TRUE ~ 1 * NA)) %&gt;%             # This line provides NA value for first year
select(Year, Group, Data,                        # Select only columns you want
       RateOfChange, BaselineChange) %&gt;%
head(5)                                          # Print the first five rows to validate


Here is the output:

# A tibble: 5 x 5
# Groups:   Group [1]
  Year Group  Data RateOfChange BaselineChange
  &lt;int&gt; &lt;fct&gt; &lt;dbl&gt;        &lt;dbl&gt;          &lt;dbl&gt;
1  2010 1a      3.5        NA             NA   
2  2011 1a      4          14.3           14.3 
3  2012 1a      3.8        -5.             8.57
4  2013 1a      4.1         7.89          17.1 
5  2014 1a      4          -2.44          14.3