我遇到了一个问题,我试图按照以下方式做一些事情:
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
包含x
和y
的产品。我对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")
在文档末尾提示我仍然收到相同的错误。有什么建议吗?
答案 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