dplyr mutate,自定义函数和变量名称作为字符

时间:2016-03-01 10:38:27

标签: r dplyr

我仍然不完全清楚如何将某些表达式传递给dplyr。

我想在mutate中使用用户定义的函数,并能够将列名称作为字符传递。我尝试使用interp {lazyeval}做了一些事情但没有成功。

请参阅下面的虚拟示例。

library(dplyr)
library(lazyeval)

# Define custom function
sumVar <- function(x, y) { x + y }

# Using bare column names (OK)
iris %>%
  mutate(newVar = sumVar(Petal.Length, Petal.Width))

# Using characters for column names (does not work)
iris %>%
  mutate_(newVar = sumVar('Petal.Length', 'Petal.Width'))

1 个答案:

答案 0 :(得分:7)

我们可以尝试

library(lazyeval)
library(dplyr)
res1 <- iris %>% 
           mutate_(newVar= interp(~sumVar(x, y),
                x= as.name("Petal.Length"), 
                y = as.name("Petal.Width")) )

OP的方法

res2 <- iris %>%
          mutate(newVar = sumVar(Petal.Length, Petal.Width))
identical(res1, res2)
#[1] TRUE

更新

dplyr的devel版本中(即将于2017年4月发布0.6.0),也可以使用quosure

varNames <- quos(Petal.Length,  Petal.Width)
res3 <- iris %>%
            mutate(newVar = sumVar(!!! varNames))

quos引用mutate内部,我们使用!!! unquote list进行评估

identical(res2, res3)
#[1] TRUE