Вот еще один вариант с crossing
library(tidyr)
crossing(dt, Year = 2003:2006)
# NAME ID col3 Year
#1 AAA 1 SB 2003
#2 AAA 1 SB 2004
#3 AAA 1 SB 2005
#4 AAA 1 SB 2006
#5 BBB 2 LA 2003
#6 BBB 2 LA 2004
#7 BBB 2 LA 2005
#8 BBB 2 LA 2006
#9 CCC 3 AL 2003
#10 CCC 3 AL 2004
#11 CCC 3 AL 2005
#12 CCC 3 AL 2006
data
dt <- structure(list(NAME = structure(1:3, .Label = c("AAA", "BBB",
"CCC"), class = "factor"), ID = c(1, 2, 3), col3 = structure(3:1, .Label = c("AL",
"LA", "SB"), class = "factor")), class = "data.frame", row.names = c(NA,
-3L))