This is a base R solution:
do.call(rbind,lapply(split(df, df$name), function(x) {
tempdf <- x
if (nrow(tempdf) > length(which(is.na(x$birthplace)))) {
tempdf[which(is.na(x$birthplace)),c("age","birthplace")] <- tempdf[which(is.na(x$birthplace))[1]-1,c("age","birthplace")]
}
return(tempdf)
}))
Output:
name age birthplace value
A 28 city1 100
A 28 city1 101
B NA city2 102
B NA city2 103
B NA <NA> 104
C NA <NA> 105
D 53 <NA> 106
D NA <NA> 107