require(data.table)
DT = as.data.table(df)
# 1. Patients with ah and ihd
DT[,.SD["ah"%in%diagnosis && "ihd"%in%diagnosis],by=id]
id diagnosis
[1,] 2 ah
[2,] 2 ihd
[3,] 2 im
[4,] 4 ah
[5,] 4 ihd
[6,] 4 angina
# 2. Patients with ah but no ihd
DT[,.SD["ah"%in%diagnosis && !"ihd"%in%diagnosis],by=id]
id diagnosis
[1,] 1 ah
[2,] 3 ah
[3,] 3 stroke
# 3. Patients with ihd but no ah?
DT[,.SD[!"ah"%in%diagnosis && "ihd"%in%diagnosis],by=id]
id diagnosis
[1,] 5 ihd