R - 嵌套、自引用条件、使用内联/向量语法的聚合赋值



* 更新 我有点惊讶,在 53 个视图中,我没有听到太多。我最初的想法是,这一定是一个相当普遍的需求。我真的很感激任何反馈
1(引用表格的性质,我也要对其进行修改
2(为什么这不更常见或任何其他见解
3(如果我的帖子缺乏清晰度或以任何方式令人困惑。
谢谢任何方向。
结束更新 *

除了"嵌套的自引用聚合赋值"之外,我不太确定该怎么称呼它。

  1. 我基本上将通过处理子集的子集 - 其中第二个由正在处理的行中的条件定义。
  2. 第一个子集可以被数据表KEYS阻止(我刚刚发现它可以显着加快处理速度。
  3. 我正在寻找子集中一列的总和。
  4. 它具有基于正在处理的行的条件。
  5. 真的 - 它可以被认为是三层(?
    • 父数据框/表
    • 块(第一个子集(
    • 条件动态子集
  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

我希望计算(并分配(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

最新更新