繁体   English   中英

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

[英]Create a column whose values are sums of values in another column based on certain conditions in 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)。

除非CO列具有值,并且FLAG值变为2,FLAG列对于每个ID的连续重复日期具有连续重复的1。在这种情况下,FLAG值变为2。例如,请参阅第9至11行。在第6至8行的情况下,日期将连续重复但是FLAG列没有连续的1。 因此,在这种情况下,对于特定的日期和ID,1不会连续出现或单独出现,那么TDD1值应与该行的DO值相同。 另外,请参阅第19,20行。

另外一点,如果在具有相同日期的一系列行中出现FLAG值为2,则需要重置TDD1列的计算。 例如,请参阅第21至25行。请注意,第21和22行的TDD1值为1370(670 + 700),而第24,25行的TDD1值为1500(1000 + 500)。

如果您可以为此提供r代码,那将是非常有用的帮助。 谢谢。

我不知道效率,但是这里是使用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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM