* 更新在 53 个观点中,我听得不多,这让我有点惊讶。我最初的想法是,这一定是一个相当普遍的需求。我真的很感激任何反馈
1)我正在对其进行修改的引用表的性质
2)为什么这不是更常见或任何其他见解
3)如果我的帖子缺乏清晰度或令人困惑反正。
感谢您的任何指导。
结束更新 *
除了“嵌套的自引用聚合分配”之外,我不太确定如何称呼它。
- 我将基本上通过处理子集的子集 - 其中第二个由正在处理的行中的条件定义。
- 第一个子集可以被数据表 KEYS 阻止(我刚刚发现它可以显着加快处理速度。)
- 我正在寻找子子集中一列的总和。
- 它具有基于正在处理的行的条件。
- 真的 - 它可以被认为是三层(?)
- 父数据框/表
- 块(第一个子集)
- 条件动态子集
- 数据的简化示例可能如下所示:
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
我正在计算(并分配)g1
它等于sum(r6)
项目子集中的项目,其中 r_rank >= 正在处理的行的项目。
速度很重要,因为使用此代码的函数将由 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)]]
谢谢...