Я принял ответ sm95. Ниже приведен более сложный пример / решение, которое отправляет список с аргументом by
:
# Libraries
library(data.table)
# Data
dt = mtcars
setDT(dt)
# Function to calculate summary statistics
myFun <- function(df, i1var, i1val, i2var, i2val, # i arguments
j, # j arguments
by1var, by2var, by2val){ # by arguments
df[get(i1var) == i1val & get(i2var) %in% i2val,
.(Count = .N,
Mean = mean(get(j)),
Median = median(get(j))),
by = .(get(by1var), get(by2var) == by2val)]
} # END Function
# Run function
myFun(dt,i1var = 'cyl', i1val = 4, i2var = 'gear', i2val = c(3,4),
j = 'hp',
by1var = 'vs', by2var = 'am', by2val = 1)
# vs am Count Mean Median
# 1: 1 1 6 75.16667 66
# 2: 1 0 3 84.66667 95
# Should match
dt[cyl == 4 & gear %in% c(3,4),
.(Count = .N,
Mean = mean(hp),
Median = median(hp)),
by = .(vs, am == 1)]
# vs am Count Mean Median
# 1: 1 1 6 75.16667 66
# 2: 1 0 3 84.66667 95
Вот моя шпаргалка:
- Pass
i
, j
и by
переменные, использующие get(var)
- Pass
i
или by
критерии непосредственно
Вышеуказанное может не относиться к более сложным функциям и не может быть оптимальное.
Если by
является вектором, а НЕ списком (например, by=c()
против by=.()
), то by
аргументы могут быть переданы напрямую.