1

* アップデート53回のビューのうち、あまり聞いたことがないことに少し驚いています。私の当初の考えでは、これはかなり一般的なニーズであるに違いありません。1)私
が変更を加えている表を参照する性質
2)これがより一般的ではない理由、またはその他の洞察
3)私の投稿に明確さが欠けているか、混乱している場合とりあえず。
方向性をありがとう。
更新終了*

これを「ネストされた自己参照集約代入」以外に何と呼ぶべきかよくわかりません。

  1. 私は本質的にサブセットのサブセットを処理することによって行います.2番目は処理中の行の条件によって定義されます.
  2. 最初のサブセットは、データ テーブル KEYS によってブロックされる可能性があります (これにより、処理が大幅に高速化されることがわかりました)。
  3. 子サブセットの列の合計を探しています。
  4. 処理中の行に基づく条件があります。
  5. 本当に-それは3層と見なすことができます(?)
    • 親データ フレーム/テーブル
    • ブロック (最初のサブセット)
    • 条件付き動的サブセット
  6. データの単純化された例は次のようになります。
  set_num respd_num opt_num            r6 r_rank            g1
        1     10002       1 -0.2105112116      1 -0.8382152438
        1     10002       2 -0.0390887667      7  0.0140819481
        1     10002       3  0.0657098525     10  0.0657098525
        1     10002       4 -0.0515756431      6 -0.0374936950
        1     10002       5 -0.2010318437      2 -0.6277040322
        1     10002       6 -0.1320728396      4 -0.2512542469
        1     10002       7 -0.1754179416      3 -0.4266721885
        1     10002       9 -0.0192308747      8  0.0531707148
        1     10002      10 -0.0816877122      5 -0.1191814073
        1     10002      11  0.0066917370      9  0.0724015895

r_rank >= 処理中の行のアイテムのこのサブセットの for アイテムにg1等しい計算 (および割り当て) を探しています。sum(r6)

このコードを使用する関数は OPTIM によって呼び出されるため、速度は重要です。

これがsqldfコードです。私は data.table .SD を使ってやってみましたが、ランキングの部分で作業するようにしましたが、遅すぎて終了することさえできませんでした。でやってみましたlapply。これは非常にうまく機能するランク計算です。ただし、この課題の必要に応じて変更することはできません。

tbl_all_data <- tbl_all_data[,r_rank:=rank(r6),by=key(tbl_all_data)]   

このネストされた自己参照の合計タスクは、この関数/モデルを構成する多くの部分の中で最も時間がかかるという点で、おそらく私にとって最も困難です。

f_new <- sqldf("select *,
                      (select sum(r6) 
                      from df t2  
                      where 
                      t2.set_num = t1.set_num and 
                      t2.resp_id = t1.resp_id and
                      t2.r_rank >= t1.r_rank
                      ) as g1                    
                 from df t1
                 ORDER BY t1.set_num, t1.opt_num")

非常に高速で、実装が適度に簡単な (つまり、C で記述していない) ソリューションが必要であり、前向きな方向性があれば幸いです。

*更新*
ループで処理する場合、dfまたはdtを複製して...

i = 3
for (i in 1:nrow(dt1)) {
   print(i)
   dt1[i,test:=dt2[set_num==dt1[i,set_num] & respd_num==dt1[i,respd_num] & r6<dt1[i,r6],sum(r6)]]
}

しかし、これには非常に長い時間がかかります。

データ テーブル構文を使用すると、部分的にそこに到達できます。

new_df <- dt1[,sum(r6),by=list(set_num,respd_num)]  

r6 の条件 (3 の最後の条件) をどのように処理しますか。

私は以下を試しました。どちらも私が探している有効な値を返しませんが、私が何をしようとしているのかについてのアイデアを与えるかもしれません:

new_df <- dt1[,sum(r6<dt1[,r6]),by=list(set_num,respd_num)]
new_df <- dt1[r6<dt1[,r6],sum(r6),by=list(set_num,respd_num)]]

どうも...

4

1 に答える 1

1

あなたの計算を理解しているかどうかはわかりません。最初のグループのg1を正しく計算するこれがありますが、たとえば最後のg1が0.94894587ではなく0.903220である理由がわかりません。

s <- 'set_num respd_num   opt_num   r6            r_rank  g1
1       1002        1         0.903219719   1       0.000000
1       1002        2         0.411544925   4       2.460055
1       1002        3         0.770223176   3       1.689832
1       1002        4         0.786611795   2       0.903220
2       1002        1         0.485307389   3       1.689832
2       1002        2         0.94894587    1       0.000000
2       1002        3         0.430522339   4       2.460055
2       1002        4         0.705036633   2       0.903220'

library(plyr)
df <- read.table(text=s, header=TRUE)

ddply(df, c('set_num', 'respd_num'), function(x) {
    oo <- order(x$r_rank)
    g2 <- Reduce(.Primitive("+"), x$r6[oo], init=0, accumulate=TRUE)
    x$g2 <- g2[order(oo)]
    x
  })

出力:

  set_num respd_num opt_num        r6 r_rank       g1        g2
1       1      1002       1 0.9032197      1 0.000000 0.0000000
2       1      1002       2 0.4115449      4 2.460055 2.4600547
3       1      1002       3 0.7702232      3 1.689832 1.6898315
4       1      1002       4 0.7866118      2 0.903220 0.9032197
5       2      1002       1 0.4853074      3 1.689832 1.6539825
6       2      1002       2 0.9489459      1 0.000000 0.0000000
7       2      1002       3 0.4305223      4 2.460055 2.1392899
8       2      1002       4 0.7050366      2 0.903220 0.9489459
于 2013-07-25T16:37:19.507 に答える