* 更新 我有点惊讶,在 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 代码。我试过用数据表做事。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)]]
感谢。。。
不确定是否理解您的计算。我有这个可以正确计算第一组的 g1,但我无法弄清楚为什么例如最后一个 g1 是 0.903220而不是 0.94894587。
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