簡體   English   中英

dplyr混合SE和NSE

[英]dplyr mixing SE and NSE

我在將SE和NSE dplyr評估結合到函數中時遇到困難。 我有一個數據集,我想根據該數據集根據不同列上的出現次數進行划分。

讓我用我想要的功能編寫一個小功能

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)

我已經嘗試了該功能的各種替代方法,但沒有一個起作用。

我缺少什么?

在這種情況下,需要在其標准評估版本( 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“獲得”標准評估,並且對是否有比上面的代碼更好的方法感興趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM