с использованием
library(tidyverse)
dt%>%
group_by(name)%>%
mutate_at(vars(C2,V2),funs(ifelse(c(0,diff(year))==1,lag(.),.)))
# A tibble: 8 x 6
# Groups: name [3]
name year x V2 C2 KeyC
<fct> <int> <fct> <int> <dbl> <int>
1 A 2001 ... 4 7.00 NA
2 A 2002 ... 4 7.00 1
3 A 2003 ... 2 0.500 0
4 A 2005 ... 3 0.300 NA
5 B 2004 ... 0 0.400 NA
6 B 2006 ... 1 7.00 NA
7 B 2007 ... 1 7.00 1
8 C 2002 .... 4 4.00 NA
Вы также можете использовать
library(data.table)
setDT(dt)[,c("C2","V2") := lapply(.SD,function(x)ifelse(c(0,diff(year))==1,shift(x),x)),by=name, .SDcols=c("C2","V2")]
dt
name year x V2 C2 KeyC
1: A 2001 ... 4 7.0 NA
2: A 2002 ... 4 7.0 1
3: A 2003 ... 2 0.5 0
4: A 2005 ... 3 0.3 NA
5: B 2004 ... 0 0.4 NA
6: B 2006 ... 1 7.0 NA
7: B 2007 ... 1 7.0 1
8: C 2002 .... 4 4.0 NA