Мы можем использовать apply
df1[] <- t(apply(df1, 1, function(x) replace(x, duplicated(x, fromLast = TRUE) &
seq_along(x) == 1, NA)))
df1
# c1 c2 c3
#1 NA 1 4
#2 5 2 9
#3 3 1 8
#4 NA 2 7
#5 NA 9 1
Или использовать векторизованную опцию с rowSums
df1[,1][rowSums(df1[,1] == df1[-1]) > 0] <- NA
данными
df1 <- structure(list(c1 = c(1L, 5L, 3L, 7L, 9L), c2 = c(1L, 2L, 1L,
2L, 9L), c3 = c(4L, 9L, 8L, 7L, 1L)), class = "data.frame",
row.names = c(NA,
-5L))