【问题标题】:Passing conditional expression into a user definded function with dplyr (R)使用 dplyr (R) 将条件表达式传递给用户定义的函数
【发布时间】: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 在每一行中。

标签: r dplyr


【解决方案1】:

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

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

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

【讨论】:

  • 这很好用,你对lazy()interp() 的解释澄清了很多事情。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2018-03-18
相关资源
最近更新 更多