我尝试使用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;。有什么方法可以绕过这个问题吗?
谢谢!
答案 0 :(得分:0)
看起来你对lazy
s有点过分了。 lazy()
函数创建了一个惰性对象,它基本上会延迟对表达式的求值。你不能只是撰写标准表达式和懒惰表达式。通常,您可以通过lazyeval的interp()
函数将它们组合在一起。我想你想要的是
mutate_(new_num = interp(~num_pimp - sum(freq[!(x)]), x=lazy(conds)))
这里我们使用interp()
来获取标准表达式(在本例中使用公式语法)并将惰性表达式作为子集向量插入。