我正在尝试编写一些包装函数来减少代码重复data.table
。
这是一个使用mtcars
. 首先,设置一些数据:
library(data.table)
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")