1

将项目返回到 时data.table,如果它们自动采用变量的名称,那就太好了。如何做到这一点?这就是我的意思:

require(data.table)
x = data.table(a=1:10, id=1:2)
x[,{s = sum(a); p=prod(a); y = sqrt(abs(s*p)); z = y+1; list(y, z)},by=id]

#   id V1   V2
#1:  1 25  945
#2:  2 30 3840

如果将列标记为and而不是V1andV2会很好。在这里做这件事没什么大不了的,但是如果你有 20 列,那就真的很痛苦了。关于如何做到这一点的任何想法?sp

编辑:我更改了问题以明确为什么我不只是做 list(name = value)

4

3 回答 3

3

如果我遗漏了什么,请原谅我……但这不是您要查找的标准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为一个expressioneval它。

foo <- expression(list(s=sum(a), p=prod(a)))

x[, eval(foo), by=id]

然后可以将其扩展为一个函数(使用as.quotedfromplyr代替它会很方便):

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]
于 2013-05-14T20:05:25.520 回答
2

其他两个答案的混音 - 在列表中命名它们:

x[,{s = sum(a); p=prod(a); y = sqrt(abs(s*p)); z = y+1;
    list(s = y, p = z)}, by=id]

或构建一个data.table

x[,{s = sum(a); p=prod(a); y = sqrt(abs(s*p)); z = y+1;
    data.table(y, z)}, by=id]

这是另一个使用选项Hmisc(这比手动命名要慢,但可能比 快data.table):

library(Hmisc)
x[,{s = sum(a); p=prod(a); y = sqrt(abs(s*p)); z = y+1;
    llist(y, z)}, by=id]
于 2013-05-14T20:19:04.120 回答
1

如果您有大量的变量并且您正在寻找一种编程方式来解决这个问题,您可以将列的名称放在一个向量中,然后使用sapply例如.SDcols

## sample data
set.seed(7)
DT <- as.data.table(matrix(round(runif(130, 1, 100)), ncol=26))
setnames(DT, LETTERS)


## These are the columns we will compute on
Cols <- c("A", "G", "M", "W", "Z")

DT[,sapply(.SD,mean),.SDcols=Cols]

#    A    G    M    W    Z 
# 25.0 41.2 55.6 43.0 56.0     

如果要对每个变量计算不同的函数,请使用标准list(nm=function(x))

于 2013-05-14T20:37:54.090 回答