首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带滤波函数的do.call

带滤波函数的do.call
EN

Stack Overflow用户
提问于 2015-09-11 23:06:20
回答 3查看 544关注 0票数 0

我希望能够动态地将搜索参数传递给dplyr的过滤器函数。我可以手动进行这样的搜索:

代码语言:javascript
复制
filter(df, sex=='F', country=='USA')

但我需要能够动态地做到这一点。

我试过do.call,就像这样:

代码语言:javascript
复制
do.call('filter',list(df,country=='USA'))

但这给了我一个错误:

找不到对象国

如果我把国家在引号中,我不会得到一个错误,但我不会得到任何结果从过滤器。

EN

回答 3

Stack Overflow用户

发布于 2015-09-12 04:29:28

根据史密斯的建议,我想出:

代码语言:javascript
复制
 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))
票数 4
EN

Stack Overflow用户

发布于 2015-09-12 17:50:19

我认为这个请求是想要有多个标准。我需要使用个人标准的字符表示和带有"&“的paste来获得成功。尝试了几种使用具有一致失败的公式对象的不同方法:

代码语言:javascript
复制
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参数将接受字符或公式规范的列表:

代码语言:javascript
复制
  do.call(filter_, list(df,.dots=list(filter_criterion2, filter_criterion1)))
  sex country
1   F     USA
2   F     USA
3   F     USA
票数 1
EN

Stack Overflow用户

发布于 2015-09-12 19:34:42

最近,我开始在动态情况下使用filter_ (请参阅答案here),使用包lazyeval。根据你正在做的事情,它可能是相关的,尽管你的实际情况可能更简单。

您可以通过创建一个要使用条件的变量向量和与每个变量的条件长度相同的向量来做类似的事情。

代码语言:javascript
复制
library(lazyeval)

variables = c("country", "sex")
conditions = c("USA", "F")

然后可以循环遍历变量/条件,使用interp创建要筛选的条件列表。

代码语言:javascript
复制
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

代码语言:javascript
复制
filter_(df, .dots = dots)
  sex country
1   F     USA
2   F     USA
3   F     USA
4   F     USA
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32533327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档