Or with plyr::ddply
...
require( plyr )
ddply( Data , "Catg" , transform , Res = cumsum(Val) )
# Catg Val Res
#1 A 67 67
#2 A 42 109
#3 A 12 121
#4 A 32 153
#5 A 28 181
#6 B 1 1
#7 B 11 12
#8 B 9 21
#9 C 38 38
#10 C 61 99
#11 C 75 174
#12 D 99 99
#13 D 22 121
#14 D 44 165
#15 D 89 254
#16 D 99 353
#17 D 51 404
#18 D 34 438
#19 D 82 520
#20 E 99 99
#21 E 74 173
#22 F 42 42