【问题标题】:Passing a column name to written function which uses dplyr functions将列名传递给使用 dplyr 函数的编写函数
【发布时间】:2017-06-20 23:44:19
【问题描述】:

我有一个我写的函数,它应该过滤一些值,然后生成一个交叉表。它使用 dplyr filter,select 命令过滤值。

我的问题是,当我将列的名称传递给函数时,我得到一个错误,并且当我将名称作为带有“”的字符串传递时,它不会过滤观察结果。 代码如下:

fnDoCrosstab <- function(a) {
  x <- surv_data1 %>% filter(a != "blank") %>% select(a) %>% as.matrix() %>% as.vector()
  y <- surv_data1 %>% filter(a != "blank") %>% select(segment_name) %>% as.matrix() %>% as.vector()
  CrossTable(x,y, format = "SPSS",prop.chisq = F)
}
fnDoCrosstab(b_thisyear)

【问题讨论】:

标签: r function dplyr


【解决方案1】:

使用最新版本的 dplyr (0.7),你可以做这样的事情

library(dplyr)

fnDoCrosstab <- function(a) {
  a <- enquo(a)
  x <- mtcars %>% filter((!!a) != 0) %>% select(mpg, !!a) %>% as.vector()
  x
}
fnDoCrosstab(am)
fnDoCrosstab(vs)

您使用enquo() 捕获未评估的字段名称,然后根据需要使用!! 扩展它

【讨论】:

  • 成功了!虽然我不确定为什么。 enquo() 实际上是做什么的? !! 运算符是什么?
  • dplyr(更具体地说是rlang)引入了所有新内容。要了解如何使用它们,请阅读programming with dplyr vignette
  • 我尝试用 mutate 函数重现同样的东西,但它不起作用,你知道为什么吗? df &lt;- df %&gt;% filter((!!originalvar) &gt; 1) %&gt;% mutate( (!!originalvar) = 99)
  • @M4hd1 如果要在 mutate 中的等号左侧展开,则需要使用 := 而不是 =。试试mutate( (!!originalvar) := 99)
  • @MrFlick 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2018-05-09
  • 2017-09-14
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多