5
データフレームをフィルタリングして、選択した列に基づいて完全なケースだけを残したいとします。これは、NSE filter()
で行うのは簡単です: SE filter_ by function複数の列を取る
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
は、しかし、私は私が
引用された名前の列のを渡すことにどのこの操作のSEのバージョンを作成しようとする際に壁にして実行しています。
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>
残念ながら、filtered_cols
は文字ベクトルとして解析されています。 complete.cases()
に渡す複数の列名としてfiltered_cols
を処理するには、どうすればinterp()
を取得できますか?
@akrunきちんと!しかし、これは 'length(filtered_cols)== 1'のときには動作しません。 – mdlincoln