2017-03-01 77 views
1

我在混合SE和NSE dplyr評估功能時遇到困難。 我有一個數據集,我想根據不同列上的出現次數來劃分每列。dplyr混合SE和NSE

讓我寫與我的功能一個小功能後

func <- function(param) { 
mtcars %>% 
group_by(cyl) %>% 
summarise_each(funs_(lazyeval::interp(~sum(.))/lazyeval::interp(~sum(var == 
0), var = as.name(param)))) 
} 

功能是使用如func(am)func(vs)

我曾嘗試過各種替代該功能,但沒有工作。

我缺少什麼?

回答

2

在這種情況下,它的funs需要在其標準評估版本(funs_)中使用。此外,整個配方在interp的一次調用下進行。例如:

func <- function(param, data=mtcars) { 
    data %>% 
    group_by(cyl) %>% 
    summarise_each(funs_(lazyeval::interp(~sum(.)/sum(.[var==0]), var = as.name(param)))) 
} 

func("vs") 
cyl  mpg  disp  hp  drat  wt  qsec vs am gear carb 
1  4 11.28077 9.613466 9.989011 10.108352 11.749065 12.605389 Inf Inf Inf Inf 
2  6 2.23987 2.759570 2.167089 2.197898 2.640048 2.569212 Inf Inf Inf Inf 
3  8 1.00000 1.000000 1.000000 1.000000 1.000000 1.000000 NaN NA NA NA 

或者更一般的功能:

func <- function(param, param.subset, groupvar, data) { 
    data %>% 
    group_by_(groupvar) %>% 
    summarise_each(funs_(lazyeval::interp(
     ~if(is.numeric(.)) { 
     sum(.[var==param.subset])/sum(.) 
     } else { 
     length(unique(.[var==param.subset])) 
     }, var = as.name(param)))) 
} 

func(param="gender", param.subset="Girl", groupvar="grade", data=vcd::JointSports) 
grade  Freq opinion year gender 
1 1st 0.5866477  5  2  1 
2 3rd 0.6137566  5  2  1 

我還是覺得我真的不 「搞定」與dplyr標準評估,並會對是否有一個感興趣比上面的代碼更好的方法。