* アップデート53回のビューのうち、あまり聞いたことがないことに少し驚いています。私の当初の考えでは、これはかなり一般的なニーズであるに違いありません。1)私
が変更を加えている表を参照する性質
2)これがより一般的ではない理由、またはその他の洞察
3)私の投稿に明確さが欠けているか、混乱している場合とりあえず。
方向性をありがとう。
更新終了*
これを「ネストされた自己参照集約代入」以外に何と呼ぶべきかよくわかりません。
- 私は本質的にサブセットのサブセットを処理することによって行います.2番目は処理中の行の条件によって定義されます.
- 最初のサブセットは、データ テーブル KEYS によってブロックされる可能性があります (これにより、処理が大幅に高速化されることがわかりました)。
- 子サブセットの列の合計を探しています。
- 処理中の行に基づく条件があります。
- 本当に-それは3層と見なすことができます(?)
- 親データ フレーム/テーブル
- ブロック (最初のサブセット)
- 条件付き動的サブセット
- データの単純化された例は次のようになります。
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)]]
どうも...