This goes under the general category of reshaping data to long form (for your future google-fu reference):
library(reshape2)
melt(df, id.var = c('ColumnID', 'Soiltype', 'Treatment'),
value.name = "Concentration")
# ColumnID Soiltype Treatment variable Concentration
#1 1 Oh Control Concentration1 29
#2 2 LOf Treatment Concentration1 100
#3 3 Oh Treatment Concentration1 80
#4 1 Oh Control Concentration2 31
#5 2 LOf Treatment Concentration2 99
#6 3 Oh Treatment Concentration2 83
#7 1 Oh Control Concentration3 34
#8 2 LOf Treatment Concentration3 94
#9 3 Oh Treatment Concentration3 78
Removal of extra columns and ordering is left to the reader.