R - 使用测试条件使用 dplyr 过滤数据

R - filter data with dplyr using a test condition

我正在尝试根据测试条件使用 dplyrfilter 我的数据,但此测试条件可能会根据其他变量而变化。

使用内置样本数据集cars:

data(cars)

我想做这样的事情:

if (foo == 0) {
  test <- speed > 15
} else {
  test <- dist < 50
}
filter(cars, test)

这行不通。如果我把它改成这样,我就能让它工作:

if (foo == 0) {
  test <- 'cars$speed > 15'
} else {
  test <- 'cars$dist < 50'
}
filter(cars, eval(parse(text = test)))

但是

  1. 必须输入 cars$speedcars$dist 似乎违背了使用 filter 函数的目的。
  2. 根据 this SO 回答,不推荐使用 eval(parse(text = ...)) 结构。

有没有更好的方法来实现这个目标?

这对我有用:

library(dplyr)

if (foo == 0) {
  test <- cars$speed > 15
} else {
  test <- cars$dist < 50
}

filter(cars, test)

我没有发现使用 cars$speedcars$dist 的问题,只是因为您使用的是 filter。另外,你真的需要使用filter吗?有一种替代方法可以使用 base R 来执行此操作。将最后一行替换为:

cars[test,]

你可以这样做:

filter(cars, if(foo==0){speed>15}else{dist<50})

通过与简单过滤器比较进行测试:

> foo =0
> identical(filter(cars, speed>15), filter(cars, if(foo==0){speed>15}else{dist<50}))
[1] TRUE
> foo =1
> identical(filter(cars, dist<50), filter(cars, if(foo==0){speed>15}else{dist<50}))
[1] TRUE

filter 语句放在大括号内可能会更简单、更整洁:

if (foo == 0) {
  filter(cars, speed > 15)
} else {
  filter(cars, dist < 50)
}

注意如果你想在某处分配结果,if returns 值:

> ff = if (foo == 0) {
       filter(cars, speed > 15)
     } else {
       filter(cars, dist < 50)
     }
> identical(ff, filter(cars, speed>15))
[1] FALSE
> identical(ff, filter(cars, dist<50))
[1] TRUE
> foo
[1] 1