按条件和组累计的总和

时间:2014-03-23 18:33:25

标签: r

可能这个问题已经解决并在SO中得到解答,但我无法找到答案。

我是R中的一个新手,并计算了一个非常大的数据框上的条件累积和。

请看下面的例子。

c_id    s_id    dest_id type  time_transaction  refid  price_c_id
11      A   issue   21.11.11 06:00      3
9608            B       issue   21.11.11 06:12      2
31300           C       issue   21.11.11 09:50      6
112     D   issue   22.11.11 12:03      1
13      B   issue   22.11.11 12:40      2
14      A   issue   22.11.11 12:54      1
9608    B   C   prop    22.11.11 18:40  177 2
125     A   issue   23.11.11 04:06      1
145     A   issue   24.11.11 09:44      3
144     D   issue   24.11.11 10:32      6
3       B   issue   24.11.11 10:35      4
2       C   issue   24.11.11 10:58      5
1300    C   B   resp    24.11.11 19:12  177 6
1111        A   issue   25.11.11 07:03      8
1111    A   B   prop    25.11.11 07:14  114 8
12      D   issue   25.11.11 08:01      1
16      C   issue   25.11.11 08:03      1
13  B   C   prop    25.11.11 08:08  121 2
3   B   C   prop    25.11.11 08:08  121 4
9       C   issue   26.11.11 14:12      2
2   C   B   resp    26.11.11 19:54  121 5
6       B   issue   26.11.11 20:09      3
1300    B   A   resp    27.11.11 08:06  114 6

需要知道:

1)提议时的条件累计金额 提议者(这里:B)和响应者(这里是C)

提议时B的price_c_id的累计金额;并且在提议时为C(谁是响应者)的price_c_id的总和。

我做的是:

DT[,Cum.Sum:=cumsum(Sum), by = list (s_id, dest_id)].

但我不知道如何通过类型==" prop"来限制总和。 我应该得到什么。排在" prop"对于B:4和C:6(两列)。

2)响应时的条件累计和 提议者(这里:B)和响应者(这里是C)

我应该得到什么。排在" rep"对于B:8(4 + 4)和C:11(6 + 5)(两列)。响应者回答时间延迟。因此,提议者或响应者的投资组合(price_c_id)可能同时减少或增加。

3)交易结果:

B得到6,得到2。 C得到6并给出了2。

因此B的交易结果为12(8-2 + 6),C的交易结果为7(11-6 + 2)。请参阅答案的最后几列。

当结果看起来或多或少像这样时,我将不胜感激。 是否有一个聪明的方法来做这三个步骤?

c_id    s_id    de_id   type    time          refid p_c_id  s_p1    s_r1    s_p2    s_r2    s_p3    s_r3
11      A   issue   21.11.11 06:00      3                       
9608        B   issue   21.11.11 06:12      2                       
1300        C   issue   21.11.11 09:50      6                       
112     D   issue   22.11.11 12:03      1                       
13      B   issue   22.11.11 12:40      2                       
14      A   issue   22.11.11 12:54      1                       
9608    B   C   prop    22.11.11 18:40  177 2   4   6               
125     A   issue   23.11.11 04:06      1                       
145     A   issue   24.11.11 09:44      3                       
144     D   issue   24.11.11 10:32      6                       
3       B   issue   24.11.11 10:35      4                       
2       C   issue   24.11.11 10:58      5                       
1300    C   B   resp    24.11.11 19:12  177 6           8     11    12  7 
1111        A   issue   25.11.11 07:03      8                       
1111    A   B   prop    25.11.11 07:14  114 8   16  12              
12      D   issue   25.11.11 08:01      1                       
16      C   issue   25.11.11 08:03      1                       
13  B   C   prop    25.11.11 08:08  121 2   12  8               
3   B   C   prop    25.11.11 08:08  121 4   s.o.    s.o.                
9       C   issue   26.11.11 14:12      2                       
2   C   B   resp    26.11.11 19:54  121 5           12  10  11  11 
6       B   issue   26.11.11 20:09      3                       
1300    B   A   resp    27.11.11 08:06  114 6           16  14  14  16 

1 个答案:

答案 0 :(得分:0)

您可以使用" i"的逻辑参数将计算限制为特定行。

的位置
DT[i,j, ...]  

第一个问题;我猜你的意思是获得price_c_id值而不是Sum的cumsum。尝试:

DT[type=="prop", Cum.Sum:=cumsum(price_c_id), by = list (s_id, dest_id) ]

我不明白第二个和第二个问题。我们在缺乏共享的第一语言和翻译难度方面遇到了麻烦吗?

数据对象是用...创建的。请检查您是否有一个制表符分隔文件并执行不同的输入。看起来存在大量的错误注册:

dat <- read.table(text=
"c_id    s_id    dest_id type  time_transaction  refid  price_c_id
11      A   issue   21.11.11 06:00      3
9608            B       issue   21.11.11 06:12      2
31300           C       issue   21.11.11 09:50      6
112     D   issue   22.11.11 12:03      1
13      B   issue   22.11.11 12:40      2
14      A   issue   22.11.11 12:54      1
9608    B   C   prop    22.11.11 18:40  177 2
125     A   issue   23.11.11 04:06      1
145     A   issue   24.11.11 09:44      3
144     D   issue   24.11.11 10:32      6
3       B   issue   24.11.11 10:35      4
2       C   issue   24.11.11 10:58      5
1300    C   B   resp    24.11.11 19:12  177 6
1111        A   issue   25.11.11 07:03      8
1111    A   B   prop    25.11.11 07:14  114 8
12      D   issue   25.11.11 08:01      1
16      C   issue   25.11.11 08:03      1
13  B   C   prop    25.11.11 08:08  121 2
3   B   C   prop    25.11.11 08:08  121 4
9       C   issue   26.11.11 14:12      2
2   C   B   resp    26.11.11 19:54  121 5
6       B   issue   26.11.11 20:09      3
1300    B   A   resp    27.11.11 08:06  114 6 ", header=TRUE, fill=TRUE)
 DT <- data.table(dat)