我希望能够动态地将搜索参数传递给dplyr的过滤器函数。我可以手动进行这样的搜索:
filter(df, sex=='F', country=='USA')但我需要能够动态地做到这一点。
我试过do.call,就像这样:
do.call('filter',list(df,country=='USA'))但这给了我一个错误:
找不到对象国
如果我把国家在引号中,我不会得到一个错误,但我不会得到任何结果从过滤器。
发布于 2015-09-12 04:29:28
根据史密斯的建议,我想出:
df <- data.frame(
sex = sample(c('M','F'),10, replace = TRUE),
country = sample(c('USA','UK'),10, replace = TRUE)
)
filter_criteria <- ~ country == 'USA'
do.call(filter_,list(df,filter_criteria))发布于 2015-09-12 17:50:19
我认为这个请求是想要有多个标准。我需要使用个人标准的字符表示和带有"&“的paste来获得成功。尝试了几种使用具有一致失败的公式对象的不同方法:
filter_criterion1 <- "country == 'USA'"
filter_criterion2 <- "sex == 'F'"
do.call(filter_, list(df,paste(filter_criterion2, filter_criterion1, sep="&")))
sex country
1 F USA
2 F USA
3 F USA感谢史密斯指出,.dots参数将接受字符或公式规范的列表:
do.call(filter_, list(df,.dots=list(filter_criterion2, filter_criterion1)))
sex country
1 F USA
2 F USA
3 F USA发布于 2015-09-12 19:34:42
最近,我开始在动态情况下使用filter_ (请参阅答案here),使用包lazyeval。根据你正在做的事情,它可能是相关的,尽管你的实际情况可能更简单。
您可以通过创建一个要使用条件的变量向量和与每个变量的条件长度相同的向量来做类似的事情。
library(lazyeval)
variables = c("country", "sex")
conditions = c("USA", "F")然后可以循环遍历变量/条件,使用interp创建要筛选的条件列表。
dots = lapply(1:length(variables),
function(crit) interp(~y == z,
.values = list(y = as.name(variables[crit]),
z = conditions[crit])))
dots
[[1]]
~country == "USA"
<environment: 0x02eed660>
[[2]]
~sex == "F"
<environment: 0x02c6b388>然后,只需使用.dots参数filter中的结果列表即可。我在这里使用@joshuagordon的df。
filter_(df, .dots = dots)
sex country
1 F USA
2 F USA
3 F USA
4 F USAhttps://stackoverflow.com/questions/32533327
复制相似问题