You can use a combination of lapply and lapply
has.na.in.cols <- Reduce(`&`, lapply(colnames, function (name) !is.na(df[name])))
to get a vector of NA values in any column in colnames , which in turn can be used to subset the data.
df[has.any.na,]
For instance. Given:
df <- data.frame(a = c(1,2,3,4,NA,6,7), b = c(2,4,6,8,10,12,14), c = c("one","two","three","four","five","six","seven"), d = c("a",NA,"c","d","e","f","g") ) colnames <- c("a","d")
You can get:
> df[Reduce(`&`, lapply(colnames, function (name) !is.na(df[name]))),] abcd 1 1 2 one a 3 3 6 three c 4 4 8 four d 6 6 12 six f 7 7 14 seven g