"Previous" works for all records and you're not checking to see whether you're at the start of a group or the end of a group. This will only work if you're at the end of a group. Rather than trying to do all of this in a single formula, I would set up separate formulas, something like this (assuming your data is ordered by donation date and that you're grouping on donor):
{@PiorYear}
//If the donor has more than one donation date
If Previous({donor group field}) = {donor group field} then
Year(Previous({CnGf_1.CnGf_1_Date}))
else //default to current year if there is no previous record
Year({CnGf_1.CnGf_1_Date})
{@CurrentYear}
Year({CnGf_1.CnGf_1_Date})
{@RecaptureDonorYearDif}
{@CurrentYear} - {@PriorYear}
{@RecaptureDonor}
//this evaluates to True or False without the If
{@RecaptureDonorYearDif} >= 2
You can then test these formulas to see what the values are. Then, instead of creating a formula to display the values with the headings, you have a couple of options:
1. Create a separate text object on the report for each label then drag each of the formulas next to its corresponding label. Format the numbers so that they don't show decimals (your "ToText" calls above, don't do that...) This makes it very easy to line up the numbers vertically.
2. Create a single text object on the report that contains all of the labels. Drag the formulas into the text object so that they're embedded in it next to the appropriate label. Select each formula, right-click, format the number to not have any decimals.
-Dell