2017-03-01 3 views
1

SEとNSEの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に1回呼び出されます。

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との標準的な評価であり、上記のコードよりも優れたアプローチです。

関連する問題