可能这个问题已经解决并在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
答案 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)