Вот базовая идея R, основанная на вашем описании,
lapply(split(df, df$ID), function(i) {
i1 <- i$Name[i$Name %in% v1];
data.frame(i, Final = replace(i1, length(i1) == 0, 'NO'))
})
, которая дает,
$`1`
ID Name Final
1 1 A B
2 1 B B
4 1 D B
$`2`
ID Name Final
3 2 C F
5 2 E F
6 2 F F
$`3`
ID Name Final
7 3 C NO
ДАННЫЕ:
dput(df)
structure(list(ID = c(1L, 1L, 2L, 1L, 2L, 2L, 3L), Name = c("A",
"B", "C", "D", "E", "F", "C")), row.names = c(NA, -7L), class = "data.frame")
dput(v1)
c("B", "F")
РЕДАКТИРОВАТЬ: Если у вас есть более 1 конечных элементов, то вы можете преобразовать в строки, то есть
lapply(split(df, df$ID), function(i) {i1 <- i$Name[i$Name %in% v1];
data.frame(i, Final = ifelse(length(unique(i1)) > 1,
toString(unique(i1)), ifelse(length(unique(i1)) == 0, 'NO', i1)))})