mutate_ formula eorrors用dplyr编程

问题描述 投票:0回答:1

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

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将有一个包含zx产品的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")

在文档的最后建议我仍然收到相同的错误。有什么建议?

r dplyr
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.