There is probably a more elegant way to do this, but this gets to the goal.
DF <- data.frame(Item = c("hammer", "hammer", "hammer", "saw", "saw", "ax", "ax", "ax"),
Vendor = c(1,2,1,3,3,5,4,4))
DF
#> Item Vendor
#> 1 hammer 1
#> 2 hammer 2
#> 3 hammer 1
#> 4 saw 3
#> 5 saw 3
#> 6 ax 5
#> 7 ax 4
#> 8 ax 4
library(dplyr)
SingleVendor <- DF %>% group_by(Item) %>% summarize(N = length(unique(Vendor))) %>% filter(N == 1)
SingleVendor
#> # A tibble: 1 × 2
#> Item N
#> <fct> <int>
#> 1 saw 1
Chosen <- semi_join(DF, SingleVendor, by = "Item")
Chosen
#> Item Vendor
#> 1 saw 3
#> 2 saw 3
Created on 2022-04-20 by the reprex package (v0.2.1)