Here is one method.
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
DF <- data.frame(FirstName = c("A", "B", "C", "A", "B", "C"),
LastName = c("X", "Y", "Z", "D", "Y", "Z"),
Value1 = rnorm(6), Value2 = rnorm(6))
distinct(DF, FirstName, LastName, .keep_all = TRUE)
#> FirstName LastName Value1 Value2
#> 1 A X -0.19443993 -1.495899
#> 2 B Y 0.76503945 -0.422182
#> 3 C Z -0.07138707 -2.119441
#> 4 A D 0.13985389 1.048779
NameCount <- DF |> group_by(FirstName, LastName) |> summarize(COUNT = n())
#> `summarise()` has grouped output by 'FirstName'. You can override using the `.groups` argument.
NameCount
#> # A tibble: 4 x 3
#> # Groups: FirstName [3]
#> FirstName LastName COUNT
#> <chr> <chr> <int>
#> 1 A D 1
#> 2 A X 1
#> 3 B Y 2
#> 4 C Z 2
DUPS <- inner_join(DF, NameCount, by = c("FirstName", "LastName")) |>
filter(COUNT > 1)
DUPS
#> FirstName LastName Value1 Value2 COUNT
#> 1 B Y 0.76503945 -0.4221820 2
#> 2 C Z -0.07138707 -2.1194407 2
#> 3 B Y 0.40575094 0.5006497 2
#> 4 C Z 0.53240029 -0.5305830 2
Created on 2021-11-11 by the reprex package (v2.0.1)