2016-12-21 14 views
5

Sadece seçilen sütunlara göre tam durumları bırakmak için bir veri çerçevesini filtrelemek istiyorum. Bu NSE filter() ile yapmak kolaydır: SE filter_ işlevine göre birden çok sütun alıyor

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 

Ancak ben alıntı isimleri sütunların geçirebileceği bu operasyonun bir GD sürümünü üretmeye çalışırken bir duvara içinde koşuyorum.

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> 

Ne yazık ki, filtered_cols bir karakter vektörü olarak ayrıştırılıyor. filtered_cols'u complete.cases()'a geçirilecek birden çok sütun adı olarak değerlendirmek için interp() nasıl edinebilirim?

+1

@akrun düzgün! Fakat bu uzunluk (filter_cols) == 1 'olduğunda işe yaramaz – mdlincoln

cevap

5

Bu ne için uqs(), ancak f_interp() yeni kullanmak zorunda:

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) 
İlgili konular