2015-01-17 28 views
6

Bir dplyr yordamına sütun dizesi olarak bir dizeyi iletmek için bir yol var mı?dplyr dizgi, sütun referansı olarak

İşte bir örnek - bir gruplandırılmış veri kümesi ve bir dizeye referans olarak bir dizeyi iletmeye çalıştığım basit bir işlev. Teşekkürler!

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") 
+1

Sen nse vinyet ('vinyet ("nse", paket = "dplyr") okumalısınız', tam olarak bu durumu giderir. – Ista

cevap

7

İşte dplyr yüklemek birlikte gelen lazyeval paketinden interp() kullanan bir seçenek. İşlevlerinizin içinde, dplyr işlevlerinin standart değerlendirme sürümünü kullanmanız gerekir. Bu durumda bu mutate_() olacaktır. Yeni sütun position çünkü machines yılında gruplandırma kurdum nasıl burada Cost sütuna özdeş olacağı

Not. my_fun() numaralı çağrıya yapılan ikinci çağrı, farklı bir gruplama değişkenleri kümesi üzerinde çalıştığını gösterir.

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 
0

Biz lazyeval paketinin kullanılmadan standart değerlendirmede değerlendirebilir. setNames kullanarak değişken ad olarak bazı dizeler belirleyebiliriz.

library(tidyverse) 

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, col) { 
    mutate_(data, .dots = setNames(paste0("cumsum(", col, ")"), "position")) 
} 

my_fun(machines %>% group_by(Date, Model.Num), "Cost") 
# Source: local data frame [6 x 4] 
# Groups: Date, Model.Num [6] 
# 
# Date Model.Num Cost position 
# <fctr> <fctr> <dbl> <dbl> 
# 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 
my_fun(machines %>% group_by(Model.Num), "Cost") 
# Source: local data frame [6 x 4] 
# Groups: Model.Num [2] 
# 
# Date Model.Num Cost position 
# <fctr> <fctr> <dbl> <dbl> 
# 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