2014-09-25 39 views
1

我的數據是這樣的一列:創建它們的值是基於一定條件的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。另一點,如果在具有相同日期的一系列行中出現2的標誌值,則需要重置TDD1列的計算。例如,請參見第21到25行。請注意,第21行和第22行的TDD1值爲1370(670 + 700),行24,25的TDD1值爲1500(1000 + 500)。

如果您可以爲此提供r代碼將會非常有幫助。謝謝。

+0

你有沒有對此做過任何嘗試? – DMT 2014-09-25 22:01:14

+0

@DMT:我做了不成功的嘗試。我無法獲得能夠滿足上述所有情況的代碼。我看到它的方式,cumsum()在這種情況下可用於計算DO值。但是,具有CO值的行增加了複雜性。當FLAG = 2時,在具有相同日期連續重複的行之間出現計算需要重置。有什麼想法嗎? – 2014-09-25 22:12:53

+0

您是否試過,而不是創建一個處理整個事件的一般函數,以處理連續重複日期的批次?以這種方式分解您的問題似乎讓生活變得容易很多,假設我正確理解當計算TDD1 – DMT 2014-09-25 22:19:47

回答

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。

+1

非常感謝。有用!只是要清楚你的效率是什麼意思? – 2014-09-26 05:04:30

+0

我的意思是速度,因爲代碼創建了一些輔助的東西。但我想這不會成爲一個問題,因爲那些dplyr的例程會變得很快。 – Athos 2014-09-26 05:13:05

相關問題