This returns just what I would expect. All I added is an arrange() at the end to make it easier to evaluate the calculations. Do you get something different?
library(dplyr)
gvkey <- c(1, 1, 1, 1, 2,2,2, 4, 4 )
Fyear <- c(2005,2006,2007,2008, 2007,2008,2009 , 2011,2012)
cashflow <- c(100, 110, 120, 130, 500, 550, 600, 50, 60)
lagAT <- c(1000,1500,1300,1200, 300,500, 800, 70, 40)
set1 <- data.frame(gvkey, Fyear, cashflow, lagAT)
set1 <- set1%>%
group_by(gvkey) %>%
arrange(Fyear) %>%
mutate(difcash = (cashflow - lag(cashflow)))
set1 <- set1%>%
group_by(gvkey) %>%
arrange(Fyear) %>%
mutate(yoy2= difcash/lagAT) %>%
arrange(gvkey, Fyear)
set1
#> # A tibble: 9 x 6
#> # Groups: gvkey [3]
#> gvkey Fyear cashflow lagAT difcash yoy2
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 2005 100 1000 NA NA
#> 2 1 2006 110 1500 10 0.00667
#> 3 1 2007 120 1300 10 0.00769
#> 4 1 2008 130 1200 10 0.00833
#> 5 2 2007 500 300 NA NA
#> 6 2 2008 550 500 50 0.1
#> 7 2 2009 600 800 50 0.0625
#> 8 4 2011 50 70 NA NA
#> 9 4 2012 60 40 10 0.25
Created on 2020-05-16 by the reprex package (v0.3.0)