簡體   English   中英

在函數內將多個參數傳遞給 data.table

[英]Passing multiple arguments to data.table inside a function

這是我想要的data.table輸出。

library(data.table)
dt_mtcars <- as.data.table(mtcars)

## desired output ----
dt_mtcars[mpg >20
          , .(mean_mpg = mean(mpg)
              ,median_mpg = median(mpg))
          , .(cyl, gear)]

   cyl gear mean_mpg median_mpg
1:   6    4   21.000      21.00
2:   4    4   26.925      25.85
3:   6    3   21.400      21.40
4:   4    3   21.500      21.50
5:   4    5   28.200      28.20

我想通過將參數傳遞給函數來獲取輸出。

processFUN <- function(dt, where, select, group){

  out <- dt[i=eval(parse(text = where))
            ,j=eval(parse(text = select))
            ,by=eval(parse(text = group))]

  return(out)
}

report <- processFUN(dt_mtcars 
                     ,where= "mpg > 20"
                     ,select= ".(mean_mpg = mean(mpg), median_mpg = median(mpg))"
                     ,group= ".(cyl, gear)")

但是,我收到一條錯誤消息。

 Error in .(cyl, gear) : could not find function "." 

只是給你一個替代方案,如果你可以/想要使用table.express ,你也可以在許多情況下使用字符串:

library(data.table)
library(table.express)

processFUN <- function(dt, where, select, group) {
  dt %>%
    start_expr %>%
    group_by(!!!group, .parse = TRUE) %>%
    where(!!!where, .parse = TRUE) %>%
    transmute(!!!select, .parse = TRUE) %>%
    end_expr
}

processFUN(as.data.table(mtcars),
           "mpg>20",
           c("mean_mpg = mean(mpg)", "median_mpg = median(mpg)"),
           c("cyl", "gear"))
   cyl gear     V1    V2
1:   6    4 21.000 21.00
2:   4    4 26.925 25.85
3:   6    3 21.400 21.40
4:   4    3 21.500 21.50
5:   4    5 28.200 28.20

在下一個版本中, start_exprend_expr將是可選的。

你真的想把條件作為字符串傳遞嗎? 如果是這樣,一種方法是使用paste一起構造查詢,然后使用eval(parse...來評估它

library(data.table)

processFUN <- function(dt, where, select, group){
    eval(parse(text = paste0(as.character(substitute(dt)), "[", where, ",", 
               select, ",by = ", group, "]")))
}

processFUN(dt_mtcars 
          ,where= "mpg > 20"
          ,select= ".(mean_mpg = mean(mpg), median_mpg = median(mpg))"
          ,group= ".(cyl, gear)")


#   cyl gear mean_mpg median_mpg
#1:   6    4   21.000      21.00
#2:   4    4   26.925      25.85
#3:   6    3   21.400      21.40
#4:   4    3   21.500      21.50
#5:   4    5   28.200      28.20

或使用evalsubstitute

library(data.table) #Win R-3.5.1 x64 data.table_1.12.2
dt_mtcars <- as.data.table(mtcars)

processFUN <- function(dt, where, select, group) {

    out <- dt[i=eval(substitute(where)), 
        j=eval(substitute(select)), 
        by=eval(substitute(group))]

    return(out)
}

processFUN(dt_mtcars, mpg>20, .(mean_mpg=mean(mpg), median_mpg=median(mpg)), .(cyl, gear))

我能找到的一些最早的參考文獻是

  1. 使用 data.table 聚合小計和總計
  2. 在函數中使用 data.table i 和 j 參數

舊的 faq 1.6 包含對此的引用: http : //datatable.r-forge.r-project.org/datatable-faq.pdf

暫無
暫無

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

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