dplyr字符串作为列引用

use*_*897 7 r dplyr

无论如何将字符串作为列引用传递给dplyr过程?

下面是一个示例 - 使用分组数据集和一个简单函数,我尝试将字符串作为引用传递给列.谢谢!

machines <- data.frame(Date=c("1/31/2014", "1/31/2014", "2/28/2014", "2/28/2014", "3/31/2014", "3/31/2014"), 
            Model.Num=c("123", "456", "123", "456", "123", "456"), 
            Cost=c(200, 300, 250, 350, 300, 400))

my.fun <- function(data, colname){
    mutate(data, position=cumsum(as.name(colname)))
}

machines <- machines %>% group_by(Date, Model.Num)     
machines <- my.fun(machines, "Cost")
Run Code Online (Sandbox Code Playgroud)

Ric*_*ven 7

下面是一个使用的选项interp()lazyeval包,带着你的dplyr安装.在您的函数内部,您需要使用dplyr函数的标准评估版本.在这种情况下,这将是mutate_().

请注意,由于您在如何设置分组,新列position将与Cost此处的列相同machines.第二个调用my_fun()显示它处理一组不同的分组变量.

library(dplyr)
library(lazyeval)

my_fun <- function(data, col) {
    mutate_(data, position = interp(~ cumsum(x), x = as.name(col)))
}

my_fun(machines, "Cost")
#        Date Model.Num Cost position
# 1 1/31/2014       123  200      200
# 2 1/31/2014       456  300      300
# 3 2/28/2014       123  250      250
# 4 2/28/2014       456  350      350
# 5 3/31/2014       123  300      300
# 6 3/31/2014       456  400      400

## second example - different grouping
my_fun(group_by(machines, Model.Num), "Cost")
#        Date Model.Num Cost position
# 1 1/31/2014       123  200      200
# 2 1/31/2014       456  300      300
# 3 2/28/2014       123  250      450
# 4 2/28/2014       456  350      650
# 5 3/31/2014       123  300      750
# 6 3/31/2014       456  400     1050
Run Code Online (Sandbox Code Playgroud)