Попробуйте:
DF <- data.frame(`2018 Data` = c("ID","1110","1120","1131"),
Codes = c("Names","Crop..","Anim..","Timb.."),
`Code1` = c("Code1Name","0","0","0"),
`Code2` = c("Code2Name","0","0","0"),
`Code3` = c("Code3Name","0","0","0"))
names(DF) <- unname(unlist(DF[1,]))
DF %>%
filter(ID != "ID") %>%
pivot_longer(starts_with("Code"), names_to = "Codes", values_to = "Value") %>%
mutate(Code = sub("Name","",Codes)) %>%
select(ID, Names, Codes, Code, Value) %>%
as.data.frame()
Результат
ID Names Codes Code Value
1 1110 Crop.. Code1Name Code1 0
2 1110 Crop.. Code2Name Code2 0
3 1110 Crop.. Code3Name Code3 0
4 1120 Anim.. Code1Name Code1 0
5 1120 Anim.. Code2Name Code2 0
6 1120 Anim.. Code3Name Code3 0
7 1131 Timb.. Code1Name Code1 0
8 1131 Timb.. Code2Name Code2 0
9 1131 Timb.. Code3Name Code3 0
PS: gather()
функция удалена, используйте pivot_longer()
вместо