Я подозреваю, что ваши данные могут быть больше, чем в этом примере, поэтому в более общем случае можно использовать скользящее соединение. Я считаю, что проще всего с data.table
.
Сначала создайте словарь полных данных для присоединения.
library(data.table)
setDT(data1)
dictionary <- data1[!is.na(idhm),.(year,idhm)]
dictionary
# year idhm
#1: 2000 24599
#2: 2010 5598
Затем выполните объединение on = "year"
и roll = "nearest"
.
result <- dictionary[data1,on = "year",roll="nearest"]
result[,.(cities,year,idhm)]
# cities year idhm
# 1: B 1995 24599
# 2: C 1996 24599
# 3: D 1997 24599
# 4: E 1998 24599
# 5: F 1999 24599
# 6: G 2000 24599
# 7: H 2001 24599
# 8: I 2002 24599
# 9: J 2003 24599
#10: K 2004 24599
#11: L 2005 24599
#12: M 2006 5598
#13: N 2007 5598
#14: O 2008 5598
#15: P 2009 5598
#16: Q 2010 5598
#17: R 2011 5598
#18: S 2012 5598
#19: T 2013 5598
#20: U 2014 5598
#21: V 2015 5598
# cities year idhm
Данные
data1 <- structure(list(cities = structure(1:21, .Label = c("B", "C",
"D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P",
"Q", "R", "S", "T", "U", "V"), class = "factor"), idhm = c(NA,
NA, NA, NA, NA, 24599L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 5598L,
NA, NA, NA, NA, NA), year = 1995:2015), class = "data.frame", row.names = c(NA,
-21L))