R - 使用测试条件使用 dplyr 过滤数据
R - filter data with dplyr using a test condition
我正在尝试根据测试条件使用 dplyr
到 filter
我的数据,但此测试条件可能会根据其他变量而变化。
使用内置样本数据集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)))
但是
- 必须输入
cars$speed
和 cars$dist
似乎违背了使用 filter
函数的目的。
- 根据 this SO 回答,不推荐使用
eval(parse(text = ...))
结构。
有没有更好的方法来实现这个目标?
这对我有用:
library(dplyr)
if (foo == 0) {
test <- cars$speed > 15
} else {
test <- cars$dist < 50
}
filter(cars, test)
我没有发现使用 cars$speed
和 cars$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
我正在尝试根据测试条件使用 dplyr
到 filter
我的数据,但此测试条件可能会根据其他变量而变化。
使用内置样本数据集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)))
但是
- 必须输入
cars$speed
和cars$dist
似乎违背了使用filter
函数的目的。 - 根据 this SO 回答,不推荐使用
eval(parse(text = ...))
结构。
有没有更好的方法来实现这个目标?
这对我有用:
library(dplyr)
if (foo == 0) {
test <- cars$speed > 15
} else {
test <- cars$dist < 50
}
filter(cars, test)
我没有发现使用 cars$speed
和 cars$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