使用dplyr进行mutate_ formula eorrors编程

时间:2017-12-18 22:23:10

标签: r dplyr

我遇到了一个问题,我试图按照以下方式做一些事情:

df <- tibble(x=1:5, y = c(1,0,1,0,1))
zup <- function(df, zp.col){
  dz <- df %>%
  mutate_(z = ~x * !!zp.col)
}

foo <- zup(df, zp.col =  "y")

结果foo的列z包含xy的产品。我对dplyr的编程方面很陌生,我已经阅读了Programing with dplyr几次,但我似乎无法理解我做错了什么。如何让zp.col取消引用并被识别为列而不是字符串。例如,如果我使用quo(),也可以看看我所看到的正在传递的内容:

zup <- function(df, zp.col){
  quo(dz <- df %>%
    mutate_(z = ~x + !!zp.col))
}

foo <- zup(df, zp.col =  "y")

> foo
<quosure: local>
~(dz <- df %>% mutate_(z = ~x + "y"))

任何帮助将不胜感激!

修改

由于mutate_已被替换,我改为:

zup <- function(df, zp.col){
  dz <- df %>%
    mutate(z = ~x + !!zp.col)
}

foo <- zup(df, zp.col =  "y")

返回:

 Error in mutate_impl(.data, dots) : 
  Column `z` is of unsupported type quoted call 

即使改为:

zup <- function(df, zp.col){
  out.col <- "z"
  dz <- df %>%
    mutate(!!out.col := ~x + !!zp.col)
}

foo <- zup(df, zp.col =  "y")

在文档末尾提示我仍然收到相同的错误。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我认为您的意思是将enquo与表达式而不是quo一起使用。这也允许将裸列名称作为函数的参数。

library(dplyr)

df <- tibble(x = 1:5, y = c(1, 0, 1, 0, 1))

zup <- function(df, zp.col) {

  quo.col <- enquo(zp.col)

  df %>% mutate(z = x * !!quo.col)

}

zup(df, y)

# # A tibble: 5 x 3
#       x     y     z
#   <int> <dbl> <dbl>
# 1     1     1     1
# 2     2     0     0
# 3     3     1     3
# 4     4     0     0
# 5     5     1     5