根据r中的某些条件创建一个列,其值是另一列中值的总和

时间:2014-09-25 20:48:52

标签: r

我的数据如下:

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代码,那将是一个很大的帮助。谢谢。

1 个答案:

答案 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。