我想过滤数据框以仅保留基于所选列的完整案例。使用 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
但是,我在尝试生成此操作的 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
被解析为字符向量。我怎样才能得到interp()
治疗filtered_cols
作为要传递给 complete.cases()
的多个列名?
最佳答案
这是什么uqs()
是为了,但你必须使用较新的 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)
关于r - SE filter_ by 函数采用多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41267997/