gpt4 book ai didi

r - 在函数中使用data.table i和j参数

转载 作者:行者123 更新时间:2023-12-03 12:35:24 24 4
gpt4 key购买 nike

我正在尝试编写一些包装函数,以减少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

复杂的是,由于参数 ij是在 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")

最佳答案

加文和乔希是对的。这个答案只是为了增加更多背景。这个想法是,不仅可以将变量列名传递给类似的函数,还可以使用quote()将列名的表达式传递给函数。

group = quote(car)
mtcars[, list(Total=length(mpg)), by=group][order(group)]
group Total
AMC 1
Cadillac 1
...
Toyota 2
Valiant 1
Volvo 1

尽管开始时比较困难,但它可以更灵活。无论如何,这就是主意。在内部函数中,您需要 substitute(),像这样:
tableOrder = function(x,.expr) {
.expr = substitute(.expr)
ans = x[,list(Total=length(mpg)),by=.expr]
setkeyv(ans, head(names(ans),-1)) # see below re feature request #1780
ans
}

tableOrder(mtcars, car)
.expr Total
AMC 1
Cadillac 1
Camaro 1
...
Toyota 2
Valiant 1
Volvo 1

tableOrder(mtcars, substring(car,1,1)) # an expression, not just a column name
.expr Total
[1,] A 1
[2,] C 3
[3,] D 3
...
[8,] P 2
[9,] T 2
[10,] V 2

tableOrder(mtcars, list(cyl,gear%%2)) # by two expressions, so head(,-1) above
cyl gear Total
[1,] 4 0 8
[2,] 4 1 3
[3,] 6 0 4
[4,] 6 1 3
[5,] 8 1 14

v1.8.0(2012年7月)中添加了新参数 keyby,使其更简单:
tableOrder = function(x,.expr) {
.expr = substitute(.expr)
x[,list(Total=length(mpg)),keyby=.expr]
}

欢迎在 ijby变量表达式方面进行评论和反馈。您可以做的另一件事是创建一个表,该表中的一列包含表达式,然后从该表中查找要放入 ijby的表达式。

关于r - 在函数中使用data.table i和j参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9705488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com