如果我遗漏了什么,请原谅我……但这不是您要查找的标准list
语法吗?data.table
恕我直言,它更简洁明了。
x[,
list(s = sum(a),
p = prod(a)),
by=id]
# id s p
# 1: 1 25 945
# 2: 2 30 3840
您也可以将其构建list
为一个expression
和eval
它。
foo <- expression(list(s=sum(a), p=prod(a)))
x[, eval(foo), by=id]
然后可以将其扩展为一个函数(使用as.quoted
fromplyr
代替它会很方便):
expression_maker <- function(funs, cols, names) {
require(plyr)
list_contents <- paste0(names, '=', funs, '(', cols, ')', collapse=',')
as.quoted(paste('list(', list_contents, ')'))[[1]]
}
output <- expression_maker(funs=c('sum', 'prod'), cols=c('a', 'a'), names=c('s', 'p'))
x[, eval(output), by=id]
......但是有龙!
根据 OP 的编辑:
x[,{s = sum(a); p=prod(a); y = sqrt(abs(s*p)); z = y+1; list(y, z)},by=id]
我会在函数中执行此操作并data.table
直接返回:
yourfun <- function(a) {
s <- sum(a)
p <- prod(a)
y <- sqrt(abs(s*p))
z <- y+1
data.table(y, z)
}
x[, yourfun(a), by=id]