使用dplyr(R)将条件表达式传递给用户定义函数

时间:2015-10-21 19:50:24

标签: r dplyr

我尝试使用dplyr命令创建一个子集和变异数据的函数。我的假数据是这样的:

newTest_rv <- data.frame(is_op=c(rep(0,6),rep(1,4)),
                     has_click=c(0,0,1,1,1,1,0,0,1,1),
                     num_pimp=c(3,5,1,2,3,5,2,5,3,5),
                     freq = c(rep(1,5),5,1,2,1,2)) 

我的功能是这样的:

reweight <- function(data, conds){
   require(dplyr)
   require(lazyeval)
   data %>% 
   filter_(lazy(conds)) %>%
   group_by(num_pimp) %>% 
   mutate_(lazy(new_num) = lazy(num_pimp) - lazy(sum(freq[lazy(!conds)]))) %>%   
   mutate(new_weight=freq*(1/new_num)) %>%
   ungroup()
 }

 > reweight(newTest_rv, is_op==0)

条件陈述的非标准评价&#34; is_op == 0&#34;似乎在其他地方工作,但不在组内的子集中工作&#34;懒惰(sum(freq [lazy(!conds)]))&#34;。有什么方法可以绕过这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

看起来你对lazy s有点过分了。 lazy()函数创建了一个惰性对象,它基本上会延迟对表达式的求值。你不能只是撰写标准表达式和懒惰表达式。通常,您可以通过lazyeval的interp()函数将它们组合在一起。我想你想要的是

mutate_(new_num = interp(~num_pimp - sum(freq[!(x)]), x=lazy(conds)))

这里我们使用interp()来获取标准表达式(在本例中使用公式语法)并将惰性表达式作为子集向量插入。