[英]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.