Here's another solution using the minimum function:
library(tidyverse)
library(lubridate)
#>
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#>
#> date, intersect, setdiff, union
df <- tibble(
name = c("John G.", "Jane D.", "John G.", "Jane D."),
date = c("14/03/2001", "22/04/2002", "24/06/2003", "27/07/2005")) %>%
mutate(date = as_date(date, format = "%d/%m/%y"))
df %>%
group_by(name) %>%
mutate(first_date=min(date))
#> # A tibble: 4 x 3
#> # Groups: name [2]
#> name date first_date
#> <chr> <date> <date>
#> 1 John G. 2020-03-14 2020-03-14
#> 2 Jane D. 2020-04-22 2020-04-22
#> 3 John G. 2020-06-24 2020-03-14
#> 4 Jane D. 2020-07-27 2020-04-22