4

私は財務データセットのいくつかの要約に取り組んでおり、特定の基準に関して要約をソートしたいと考えていますが、残りの要約値を連続して失うことはありません。簡単な例を次に示します。

set.seed(1)
tseq <- seq(Sys.time(), length.out = 36, by = "mins")
dt <- data.table(TM_STMP = tseq, COMP = rep(c(rep("A", 4), rep("B", 4), rep("C", 4)), 3), SEC = rep(letters[1:12],3), VOL = rpois(36, 3e+6))
dt2 <- dt[, list(SUM = sum(VOL), MEAN = mean(VOL)), by = list(COMP, SEC)]
dt2
   COMP SEC     SUM    MEAN
1:    A   a 9000329 3000110
2:    A   b 9001274 3000425
3:    A   c 9003505 3001168
4:    A   d 9002138 3000713

ここで、最大の VOL で COMP ごとの SEC を取得したいと思います。

dt3 <- dt2[, list(SUM = max(SUM)), by = list(COMP)]
dt3
   COMP     SUM
1:    A 9003505
2:    B 9002888
3:    C 9005042

これは私が望むものを与えますが、特定の行 (SEC と MEAN) に他の値を保持して、次のようにします (手動で作成):

   COMP     SUM SEC    MEAN
1:    A 9003505   c 3001168
2:    B 9002888   f 3000963  
3:    C 9005042   k 3001681

どうすればこれを達成できますか?

4

5 に答える 5

1

which.func以下で として示す@Metrics と、として示す @Arun からの 2 つの異なるアプローチのパフォーマンスに非常に興味がありましたinnate.func。そのため、上記の質問で示した例を使用してベンチマークを行いました。結果は次のとおりです。

which.func <- function() {dt3 <- dt2[, list(SUM = max(SUM), SEC=SEC[which.max(SUM)], MENA=MEAN[which.max(SUM)]), by = list(COMP)]}
innate.func <- function() {dt3 <- dt2[J(unique(COMP)), mult = "last"]}
library(rbenchmark)
benchmark(which.func, innate.func, replications = 10e+6)
        test replications elapsed relative user.self sys.self
2     innate     10000000  24.689    1.000    24.259    0.425
1 which.func     10000000  32.664    1.323    32.216    0.446

もちろん、これは which.func へのinnate.func呼び出しを伴うため、 which.func に対しては少し不公平かもしれませんsetkey。これは、特に時間消費者の大きなサンプルの場合です。setkey関数に呼び出しを含めると、次のようになります。

innate.func <- function() {setkey(dt2, COMP, SUM); dt3 <- dt2[J(unique(COMP)), mult = "last"]; setkey(dt2, NULL)}
         test replications elapsed relative user.self sys.self 
2 innate.func     10000000  25.271    1.000    24.834    0.430 
1  which.func     10000000  26.476    1.048    26.062    0.397 

2 つのアプローチのパフォーマンスは非常に似ているようです。@Arun のアプローチは、data.table に関しておそらくよりエレガントなスタイルを持ち、必要なコードが少なくなります。その欠点には、 @Metrics のアプローチがより一般的な設定で適用できるという特徴を発揮するmaxorとは異なる集計関数が伴う場合があります。min

私は両方のアプローチから学び、ツールボックスに入れました。

于 2013-10-23T08:25:24.173 に答える
0

ここに記載されている解決策をさらに検討しているときに、上記の質問の要約で別の問題に遭遇し、共有したい解決策を見つけました。

ユーザーに選択肢を提供したい場合

  1. aggregateおよびで示される集計関数
  2. で示される、aggregateメソッドが適用されるべき基準 (要約の変数)crit

次に、どの列が残っているかを確認する必要があるという問題に遭遇します(たとえば、 which を使用する@Metricsの回答を参照してください)。簡単な例:

上記の質問からdata.table を取得dt2します。ユーザーは現在、の data.table サマリー内aggregate = "max"の変数にメソッドを適用したいと考えています。これは私が見つけた解決策であり、うまく機能します(もちろん、どんな議論でも大歓迎です):crit = "SUM"dt2

aggregate = "max"
crit = "SUM"
user call <- expression(do.call(aggregate, list(get(crit))))
dt2[, .SD[which(get(crit) == eval(mycall))], by = COMP]
dt2
   COMP SEC     SUM    MEAN
1:    A   c 9002500 3000833
2:    B   g 9003312 3001104
3:    C   i 9000058 3000019
于 2013-10-23T13:44:39.683 に答える