【发布时间】:2015-10-21 19:50:23
【问题描述】:
我正在尝试创建一个使用 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)
条件语句“is_op==0”的非标准评估似乎在其他地方有效,但在“lazy(sum(freq[lazy(!conds)]))”组的子集中无效。有什么办法可以规避这个问题吗?
谢谢!
【问题讨论】:
-
您是否考虑过使用
mutate而不是mutate_? -
我不明白你在做什么。你的子集只有
conds是真的。将不再有!conds为真的行,因此您永远不会从num_pimp中减去任何内容。你想要的输出是什么? -
@Benjamin 是的,我做到了。没用:(
-
@MrFlick 哦,我在玩这个的时候把台词弄混了。过滤器应该在两个 mutate 语句之后。很抱歉造成混乱。
-
@MrFlick 所以我要做的是在每个组中用
is_op != 0(条件可能不同)的行中减去freq变量的总和来自num_pimp在每一行中。