dcast(df, a+d+b ~ f, fun.aggregate = function(x) as.character(x)[1])
#Using f as value column: use value.var to override.
# a d b G M
#1 1 500 200 G M
#2 1 500 201 G M
#3 2 500 220 G <NA>
#4 2 501 220 G <NA>
#5 3 501 200 <NA> M
#6 3 501 203 <NA> M
#7 3 501 204 G <NA>
#8 3 501 220 <NA> M
#9 3 502 204 <NA> M
#10 4 502 200 G <NA>
#11 4 502 203 G <NA>
#12 4 502 220 <NA> M
Re comment: perhaps you want this then:
library(data.table)
dt = data.table(df)
dt[, lapply(1:3, function(i) as.character(f)[i]), by = list(a, d, b)]
# a d b V1 V2 V3
# 1: 1 500 200 G M NA
# 2: 1 500 201 G M NA
# 3: 2 500 220 G NA NA
# 4: 2 501 220 G NA NA
# 5: 3 501 200 M NA NA
# 6: 3 501 220 M NA NA
# 7: 3 501 203 M NA NA
# 8: 3 501 204 G NA NA
# 9: 3 502 204 M NA NA
#10: 4 502 203 G NA NA
#11: 4 502 220 M NA NA
#12: 4 502 200 G G NA