[英]Passing unquoted function arguments to i in 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_expr
和end_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
或使用eval
與substitute
:
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))
我能找到的一些最早的參考文獻是
舊的 faq 1.6 包含對此的引用: http : //datatable.r-forge.r-project.org/datatable-faq.pdf
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.