Идея состоит в том, чтобы использовать ave
с функцией, которая считает число значений больше или равным 2015. !!
преобразует его в логическое значение, чтобы мы могли индексировать, то есть
df[!!with(df, ave(year, ID, FUN = function(i)length(i[i >= 2015]) >= 1)),]
, что дает,
ID year disease
1 1 2012 3
2 1 2016 4
3 3 2013 3
4 3 2015 4
Несколько дополнительных опций @RonakShah и @ Jaap,
df[!with(df, ave(year, ID, FUN = function(x) all(x > 2015) | all(x < 2015)))), ]
df[with(df, ave(year, ID, FUN = function(y) any(y >= 2015))),]