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

V1andの代わりに、列にandV2というラベルが付けられていると便利です。ここでこれを行うのは大したことではありませんが、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これをexpressionand it として構築することもできますeval

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

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

次に、これを関数に拡張できます (代わりにas.quotedfromを使用plyrすると便利です)。

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 に答える