We can use mutate_if
df <- df %>% mutate_if(is.factor, funs(factor(replace(., .=="", NA))))
Or using base R , we can assign specific levels NA
j1 <- sapply(df, is.factor) df[j1] <- lapply(df[j1], function(x) {is.na(x) <- levels(x)==""; x})
data
df <- data.frame(col1 = c("", "A", "B", ""), col2 = c("A", "", "", "C"), col3 = 1:4)
source share