【发布时间】:2012-03-31 02:53:17
【问题描述】:
我正在尝试编写一些包装函数来减少 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 的框架。
如何在data.table 的上下文中评估group?
更一般地说,我如何在函数中使用它?我需要以下函数来给我所有的结果,而不仅仅是第一行数据:
tableOrder <- function(x, group){
x[, list(Total=length(mpg)), by=eval(group)][order(group)]
}
tableOrder(mtcars, "car")
【问题讨论】:
标签: r data.table