6

私はdata.tableこのようなオブジェクトを持っています

library(data.table)

a <- structure(list(PERMNO = c(10006L, 10006L, 10015L, 10015L, 20000L, 20000L), 
                    SHROUT = c(1427L, 1427L, 1000L, 1001L, 200L, 200L), 
                    PRC = c(6.5, 6.125, 0.75, 0.5, 3, 4), 
                    RET = c(0.005, -0.005, -0.001, 0.05, -0.002, 0.0031)),
                   .Names = c("PERMNO", "SHROUT", "PRC", "RET"), 
               class = c("data.table", "data.frame"), row.names = c(NA, -6L))

setkey(a,PERMNO)

によっていくつかの計算を実行する必要がありPERMNOますが、この例では、それらが2つだけであると仮定しましょう:

mktcap <- a[ , tail(SHROUT,n=1)*tail(PRC,n=1),by=PERMNO]
sqret <- a[, sum(RET^2),by=PERMNO]

生産する

> mktcap
     PERMNO       V1
[1,]  10006 8740.375
[2,]  10015  500.500
[3,]  20000  800.000

> sqret
     PERMNO        V1
[1,]  10006 5.000e-05
[2,]  10015 2.501e-03
[3,]  20000 1.361e-05

PERMNO2 つの関数を 1 つに結合して、 mktcap3つの列を持つマトリックス (または data.table、data.frame など) を生成したいと思いますsqrt

問題は、このグループ化関数 (つまりvariable[ , function(), by= ]) は、キーを含む列と結果を含む列の 2 つの列でのみ結果を生成するように見えることです。

これは、私が望むものを生成するための私の試み (多くの 1 つ) です。

comb.fun <- function(datai) {
     mktcap <- as.matrix(tail(datai[,1],n=1)*tail(datai[,2],n=1),ncol=1)
     sqret <- as.matrix(sum(datai[,3]^2),ncol=1)
     return(c(mktcap,sqret))
}   

myresults <- a[, comb.fun(cbind(SHROUT,PRC,RET)), by=PERMNO]

生産する

     PERMNO           V1
[1,]  10006 8.740375e+03
[2,]  10006 5.000000e-05
[3,]  10015 5.005000e+02
[4,]  10015 2.501000e-03
[5,]  20000 8.000000e+02
[6,]  20000 1.361000e-05

(結果はすべてそこにありますが、それらは 1 つの列に強制されました)。何を試しても、グループ化して 2 つ以上の列 (または結果の 1 つ以上の列) を持つマトリックスを返すことはできません。

でグループ化して 2 つ以上の列の結果を取得することは可能data.tableですか?

4

2 に答える 2

4

答え (list()いくつかの必要な要約統計を収集するために使用) は、?data.tableヘルプ ファイルの優れた例のセクションにあります。(下から20行くらいです。)

out <- a[ , list(mktcap = tail(SHROUT,n=1)*tail(PRC,n=1),
                 sqret  = sum(RET^2)),
         by=PERMNO]

out
#    PERMNO   mktcap     sqret
# 1:  10006 8740.375 5.000e-05
# 2:  10015  500.500 2.501e-03
# 3:  20000  800.000 1.361e-05

編集:

以下のコメントで、Matthew Dowle は、jlike 呼び出しの引数x[i,j,by]がぎこちなく長くなったコードをクリーンアップする簡単な方法について説明しています。

上記の呼び出しで彼の提案を実装すると、代わりに次のことができます。

## 1) Use quote() to make an expression object out of the statement passed to j
mm <- quote(list(mktcap = tail(SHROUT,n=1)*tail(PRC,n=1),
                 sqret  = sum(RET^2)))

## 2) Use eval() to evaluate it as if it had been typed directly in the call
a[ , eval(mm), by=PERMNO]
#    PERMNO   mktcap     sqret
# 1:  10006 8740.375 5.000e-05
# 2:  10015  500.500 2.501e-03
# 3:  20000  800.000 1.361e-05
于 2012-06-27T19:03:57.133 に答える
1

どうですか

comb.fun <- function(a) {
 mktcap <- a[ , tail(SHROUT,n=1)*tail(PRC,n=1),by=PERMNO]
 sqret <- a[, sum(RET^2),by=PERMNO]

 return(merge(mktcap,sqret))
} 
于 2012-06-27T19:15:40.250 に答える