Thanks for that! I wanted to not have to enter the "Species" and "Name" to be able to complete this task, but your answer really helped!
I managed to make it work using the following code.
df_Copy is an exact replicate of the df.
df1 <- merge (df, df_Copy, by.x="Name", by.y="Species")
AdjDF <- df1 %>% mutate (ID.x = ifelse(is.na(ID.x), ID.y, ID.x), CODE.x = ifelse(is.na(CODE.x), CODE.y, CODE.x))
AdjDF <- AdjDF %>% select (Species, Name, ID=ID.x, CODE = CODE.x)
df2 <- merge(df, AdjDF, by="Species", all=TRUE)
AdjDF2 <- df2 %>% mutate (ID.x = ifelse(is.na(ID.x), ID.y, ID.x), Row.x = ifelse(is.na(CODE.x), CODE.y, CODE.x))
AdjDF2 <- AdjDF2 %>% select(Species, Name= Name.x, ID=ID.x, CODE = CODE.x)
This matches all of them at once; important as I have 1200 observations to do this to.