Мы можем использовать ifelse
df1$V3 <- with(df1, ifelse(V1 == 'A', V2, V1))
df1
# V1 V2 V3
#1 A B B
#2 C A C
#3 D A D
#4 A E E
Или, как упомянул @markus
with(df1, replace(V1, V1 == "A", V2[V1 == "A"]))
Или другой вариант - создать индекс строки / столбца с помощью max.col
, а затем извлечь значения на основе индекса
df1[cbind(seq_len(nrow(df1)), max.col(df1 != 'A'))]
#[1] "B" "C" "D" "E"
data
df1 <- structure(list(V1 = c("A", "C", "D", "A"), V2 = c("B", "A", "A",
"E")), class = "data.frame", row.names = c(NA, -4L))