我的数据如下:
ROW ID DATE DO CO FLAG
1 6405 9/16/2010 1000 . 1
2 6405 9/16/2010 0 32 2
3 6405 9/17/2010 500 . 1
4 6405 9/17/2010 1000 . 1
5 6405 9/17/2010 1000 . 1
6 6405 9/18/2010 1000 . 1
7 6405 9/18/2010 0 37 2
8 6405 9/18/2010 1250 . 1
9 6405 9/19/2010 1000 . 1
10 6405 9/19/2010 1000 . 1
11 6405 9/19/2010 0 65 2
12 6405 9/20/2010 500 . 0
13 6405 9/21/2010 1250 . 0
14 2654 8/4/2010 1000 . 0
15 2654 8/5/2010 0 15 2
16 2654 8/5/2010 900 . 1
17 2654 8/5/2010 300 . 1
18 2654 8/6/2010 750 . 0
19 2654 8/7/2010 1000 . 1
20 2654 8/7/2010 0 45 2
21 4567 6/8/2010 670 . 1
22 4567 6/8/2010 700 . 1
23 4567 6/8/2010 0 34 2
24 4567 6/8/2010 1000 . 1
25 4567 6/8/2010 500 . 1
我的数据应如下所示:
ROW ID DATE DO CO FLAG TDD1
1 6405 9/16/2010 1000 . 1 1000
2 6405 9/16/2010 0 32 2 0
3 6405 9/17/2010 500 . 1 2500
4 6405 9/17/2010 1000 . 1 2500
5 6405 9/17/2010 1000 . 1 2500
6 6405 9/18/2010 1000 . 1 1000
7 6405 9/18/2010 0 37 2 0
8 6405 9/18/2010 1250 . 1 1250
9 6405 9/19/2010 1000 . 1 2000
10 6405 9/19/2010 1000 . 1 2000
11 6405 9/19/2010 0 65 2 0
12 6405 9/20/2010 500 . 0 500
13 6405 9/21/2010 1250 . 0 1250
14 2654 8/4/2010 1000 . 0 1000
15 2654 8/5/2010 0 15 2 0
16 2654 8/5/2010 900 . 1 1200
17 2654 8/5/2010 300 . 1 1200
18 2654 8/6/2010 750 . 0 750
19 2654 8/7/2010 1000 . 1 1000
20 2654 8/7/2010 0 45 2 0
21 4567 6/8/2010 670 . 1 1370
22 4567 6/8/2010 700 . 1 1370
23 4567 6/8/2010 0 34 2 0
24 4567 6/8/2010 1000 . 1 1500
25 4567 6/8/2010 500 . 1 1500
所以我想创建一个列TDD1,其中对于每个具有连续重复日期的id,TDD1列中的对应值应该是DO列中那些连续重复日期的值的总和。例如,请参阅第3,4,5行。
如果FLAG列的值为2或0,则相应的TDD1值应为该行的DO值。例如,参见行2,7,11,15和20(对于FLAG = 2)和行12,13,14,18和23(对于FLAG = 0)。
FLAG列连续重复1,用于连续重复每个ID的日期,除非列CO具有值,并且在这种情况下FLAG值变为2.例如,请参阅第9行到第11行。如果是第6行到第8行,则日期连续重复,但FLAG列没有连续的1。因此,在1 =不连续发生或在特定日期与ID隔离发生的情况下,TDD1值应与该行的DO值相同。另外,请参阅第19,20行。
另一点,如果FLAG值为2出现在具有相同日期的一系列行中,则需要重置TDD1列的计算。例如,请参阅第21至25行。注意,第21行和第22行的TDD1值为1370(670 + 700),第24,25行的TDD1值为1500(1000 + 500)。
如果您能为此提供r代码,那将是一个很大的帮助。谢谢。
答案 0 :(得分:0)
我不知道效率,但是这里有一个使用dplyr
包的替代方案(和magrittr
的%>%以获得一些很好的代码清晰度)。
library(magrittr)
library(dplyr)
data <- data %>%
mutate(flag_1_consecutive = cumsum(!FLAG %in% 1)) %>%
group_by(ID, DATE, FLAG, flag_1_consecutive) %>%
mutate(TDD1 = sum(DO))
我所做的是按照规则对行进行分组,这些行由ID,DATE和连续标志“1”定义。然后,我只是总结了DO。