r - SE filter_ by 函数采用多列

标签 r dplyr

我想过滤数据框以仅保留基于所选列的完整案例。使用 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/

相关文章:

r - data.table 按组删除基于滞后值的行

R - 从数据框中选择行时如何防止 row.names

r - 如何有效地从(许多)大栅格中提取许多多边形的值

r - 多重 t 检验比较

r - R 中的线性回归和分组

r - 使用 r 对每行进行条件计数

r - (R, dplyr) 选择多个以相同字符串开头的列并按组汇总平均值 (90% CI)

r - Dplyr:仅当行值 > 0 时才使用汇总跨来取列的平均值

r - 对数据框中的所有变量执行相同的变异

r - 使用 dplyr 时如何保留其他列?