我正在尝试编写一些包装器函数来减少代码重复data.table.
这是一个使用的例子mtcars.首先,设置一些数据:
library(data.table)
data(mtcars)
mtcars$car <- factor(gsub("(.*?) .*", "\\1", rownames(mtcars)), ordered=TRUE)
mtcars <- data.table(mtcars)
Run Code Online (Sandbox Code Playgroud)
现在,我通常会写这个以获得按组计算的总结.在这种情况下,我分组car:
mtcars[, list(Total=length(mpg)), by="car"][order(car)]
car Total
AMC 1
Cadillac 1
Camaro 1
...
Toyota 2
Valiant 1
Volvo 1
Run Code Online (Sandbox Code Playgroud)
复杂的是,因为参数i和j在框架中进行评估,如果你想传入变量data.table,就必须使用eval(...)它们:
这有效:
group <- "car"
mtcars[, list(Total=length(mpg)), by=eval(group)]
Run Code Online (Sandbox Code Playgroud)
但现在我想通过相同的分组变量来排序结果.我无法得到以下任何变体给我正确的结果.注意我总是得到一行结果,而不是有序集.
mtcars[, list(Total=length(mpg)), by=eval(group)][order(group)]
car Total
Mazda 2
Run Code Online (Sandbox Code Playgroud)
我知道为什么:它是因为group是在而parent.frame不是框架中进行评估data.table.
我怎样才能group在上下文中进行评估data.table?
更一般地说,我如何在函数内部使用它?我需要以下函数来给我所有结果,而不仅仅是第一行数据:
tableOrder <- function(x, group){ …Run Code Online (Sandbox Code Playgroud)