Я пытаюсь написать некоторые функции-обертки, чтобы уменьшить дублирование кода с помощью data.table
.
Вот пример, используя mtcars
. Сначала настройте некоторые данные:
data(mtcars)
mtcars$car <- factor(gsub("(.*?) .*", "\\1", rownames(mtcars)), ordered=TRUE)
mtcars <- data.table(mtcars)
Теперь вот что я обычно пишу, чтобы получить сводку подсчетов по группам. В этом случае я группирую car
:
mtcars[, list(Total=length(mpg)), by="car"][order(car)]
car Total
AMC 1
Cadillac 1
Camaro 1
...
Toyota 2
Valiant 1
Volvo 1
Усложнение состоит в том, что, поскольку аргументы i
и j
оцениваются в кадре data.table
, нужно использовать eval(...)
, если вы хотите передать переменные:
Это работает:
group <- "car"
mtcars[, list(Total=length(mpg)), by=eval(group)]
Но теперь я хочу заказать результаты по одной и той же переменной группировки. Я не могу получить какой-либо вариант следующего, чтобы дать мне правильные результаты. Обратите внимание, что я всегда получаю только одну строку результатов, а не упорядоченный набор.
mtcars[, list(Total=length(mpg)), by=eval(group)][order(group)]
car Total
Mazda 2
Я знаю почему: потому что group
оценивается в parent.frame
, а не в кадре data.table
.
Как я могу оценить group
в контексте data.table
?
В общем, как я могу использовать это внутри функции? Мне нужна следующая функция, чтобы дать мне все результаты, а не только первую строку данных:
tableOrder <- function(x, group){
x[, list(Total=length(mpg)), by=eval(group)][order(group)]
}
tableOrder(mtcars, "car")