簡體   English   中英

使用表達式作為dplyr參數的R函數匯總

[英]R function with expression as parameter for dplyr summarise

好吧,這是什么,感覺應該是比較容易的,但盡管我試圖從字面上幾十個有辦法quoteevalsubstituteenquoteparsesummarize_等...我還沒有得到它的工作。 基本上,我正在嘗試計算類似的內容-但具有用於summarise參數的變量表達式:

mtcars %>% group_by(cyl) %>% summarise(wt=mean(wt),hp=mean(hp))

收益:

# A tibble: 3 × 3
    cyl       wt        hp   
    <dbl>    <dbl>     <dbl> 
1     4 2.285727  82.63636 
2     6 3.117143 122.28571 
3     8 3.999214 209.21429

我嘗試過的一件事是:

  x2 <- "wt=mean(wt),hp=mean(hp)"
  mtcars %>% group_by(cyl) %>% summarise(eval(parse(text=x2)))

收益:

Error in eval(substitute(expr), envir, enclos) : 
  <text>:1:12: unexpected ','
1: wt=mean(wt),

但是",hp=mean(hp"第二個參數( ",hp=mean(hp" )會使您無所適從:

> x2 <- "wt=mean(wt)"
> mtcars %>% group_by(cyl) %>% summarise(eval(parse(text=x2)))
Error in eval(substitute(expr), envir, enclos) : object 'wt' not found

我將盡我所能嘗試的所有其他事情-我顯然缺少關於如何在函數參數中處理表達式的知識。

那么這里合適的方法是什么? 請記住,我真的很想要這樣的事情:

getdf <- function(df,sumarg){
  df %>% group_by(cyl) %>% summarise(sumarg)
  df
}

同樣不確定在R世界中我應該對這種查詢使用哪種標簽。 元編程?

為了獲得最大的靈活性,我將使用...參數,使用lazyeval捕獲這些點,然后傳遞給summarise_

getdf <- function(df, ...){ 
    df %>% group_by(cyl) %>% summarise_(.dots = lazyeval::lazy_dots(...)) 
}

然后,您可以直接執行以下操作:

getdf(mtcars, wt = mean(wt), hp = mean(hp))
 # A tibble: 3 × 3 cyl wt hp <dbl> <dbl> <dbl> 1 4 2.285727 82.63636 2 6 3.117143 122.28571 3 8 3.999214 209.21429 

不使用...一種方法是在列表中傳遞參數,盡管您將需要使用公式或引號。 例如:

getdf2 <- function(df, args){ 
    dots <- lazyeval::as.lazy_dots(args)
    df %>% group_by(cyl) %>% summarise_(.dots = dots) 
}

並用作:

getdf(mtcars, list(wt = ~mean(wt), hp = ~mean(hp)))

要么

getdf(mtcars, list(wt = "mean(wt)", hp = "mean(hp)"))

暫無
暫無

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

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