SE filter with multiple columns

I would like to filter the data frame to leave only complete cases based on the selected columns. This is easy to do with NSE filter() :

 library(dplyr) dd <- data.frame( id = 1:4, var1 = c(1, 2, NA, 4), var2 = c(1, NA, 3, 4), var3 = c(1, NA, NA, NA)) dd1 <- dd %>% filter(complete.cases(var1, var2)) dd1 #> id var1 var2 var3 #> 1 1 1 1 1 #> 2 4 4 4 NA 

However, I am on the wall trying to create an SE version of this operation, to which I can pass the quoted column names.

 library(lazyeval) filtered_cols <- c("var1", "var2") dots <- interp(~complete.cases(x), .values = list(x = filtered_cols)) dd2 <- dd %>% filter_(.dots = dots) #> Error in eval(substitute(expr), envir, enclos): incorrect length (2), expecting: 4 str(dots) #> Class 'formula' language ~complete.cases(c("var1", "var2")) #> ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 

Unfortunately, filtered_cols parsed as a character vector. How can I get interp() to handle filtered_cols as multiple column names to be passed to complete.cases() ?

+5
source share
1 answer

uqs() used for this, but you must use the new f_interp() :

 library(lazyeval) filtered_cols <- c("var1", "var2") filtered_col_names <- lapply(filtered_cols, as.name) dots <- f_interp(~complete.cases(uqs(filtered_col_names))) dd2 <- dd %>% filter_(.dots = dots) 
+5
source

Source: https://habr.com/ru/post/1261659/


All Articles