2014-09-23 59 views
2

我的數據是這樣的:創建基於R中某些條件的欄

ROW ID DATE   DO  CO EID 
1 1 11/1/2010 1500 .  1 
2 1 11/1/2010 300 .  1 
3 1 11/2/2010 1000 .  1 
4 1 11/2/2010 750 .  1 
5 1 11/2/2010  0 15 0 
6 1 11/2/2010 1400 .  1 
7 1 11/2/2010 300 .  1 
8 2 11/4/2010 700 .  1  
9 2 11/5/2010 2000 .  1 
10 2 11/6/2010  0 20 0 
11 2 11/6/2010 1500 .  1 
12 2 11/6/2010 750 .  1 
13 2 11/6/2010 200 .  1 
14 2 11/8/2010 2500 .  1 
15 2 11/8/2010 2500 .  1 

我想它來創建一個列TDD是這樣的:

ROW ID DATE   DO  CO EID TDD 
1 1 11/1/2010 1500 .  1 1800 
2 1 11/1/2010 300 .  1 1800 
3 1 11/2/2010 1000 .  1 1750 
4 1 11/2/2010 750 .  1 1750 
5 1 11/2/2010  0 15 0 1750 
6 1 11/2/2010 1400 .  1 1700 
7 1 11/2/2010 300 .  1 1700 
8 2 11/4/2010 700 .  1  700 
9 2 11/5/2010 2000 .  1 2000 
10 2 11/6/2010  0 20 0 2000 
11 2 11/6/2010 1500 .  1 2450 
12 2 11/6/2010 750 .  1 2450 
13 2 11/6/2010 200 .  1 2450 
14 2 11/8/2010 2500 .  1 5000 
15 2 11/8/2010 2500 .  1 5000 

所以列TDD是什麼,但一個特定ID的相同日期的DO值之和,例如。請參閱第1,2和14,15行。但是,CO值增加了複雜性。注意行3到7,日期是相同的,但所有五行不具有相同的TDD值。第6行和第7行的TDD值是1700而不是1750(第3行到第5行),因爲第5行中的CO列有一個值。

行10到13也具有相同的日期,但行9的TDD值是2000而不是2450.因此,具有CO值的行的TDD值將與其之前的TDD值相同相同的ID。而且,即使日期相同,具有CO值的行也會重置TDD的計算。請參閱第3到第7行。

數據的性質使得每當CO列有值時,DO和EID都爲0。我的數據中有數千個ID,結構相似。如果您可以幫助我使用r代碼根據上述條件計算TDD列的值,那將是非常好的。謝謝。

+0

CO和TDD值之間沒有相關性。 CO值由我任意選擇。我只是想表明,當CO取值時,TDD的計算需要重置。您所指的TDD值1700是行6和行7的DO值的總和。TDD值2450是行11,12和13的DO值的總和。 – 2014-09-23 20:40:18

+0

MrFlick,對不起我的壞。對於輸入中第7行的DATE,它應該是11/2/2010。我如何糾正它? – 2014-09-23 20:43:33

+0

MrFlick第9行和第10行不應該是同一天。 – 2014-09-23 20:44:35

回答

2

然後,你可以讓你帶着幾分標準ave()接着是「發揚光大最後觀察」中描述的結果調用

library(zoo) #for na.locf() 
dd$TDD <- with(dd, ave(DO, ID, DATE, c(0, cumsum(diff(EID)>0)), FUN=sum)) 
is.na(dd$TDD) <- dd$CO!="." 
dd$TDD <- na.locf(dd$TDD) 

結果是

ROW ID  DATE DO CO EID TDD 
1 1 1 11/1/2010 1500 . 1 1800 
2 2 1 11/1/2010 300 . 1 1800 
3 3 1 11/2/2010 1000 . 1 1750 
4 4 1 11/2/2010 750 . 1 1750 
5 5 1 11/2/2010 0 15 0 1750 
6 6 1 11/2/2010 1400 . 1 1700 
7 7 1 11/2/2010 300 . 1 1700 
8 8 2 11/4/2010 700 . 1 700 
9 9 2 11/5/2010 2000 . 1 2000 
10 10 2 11/6/2010 0 20 0 2000 
11 11 2 11/6/2010 1500 . 1 2450 
12 12 2 11/6/2010 750 . 1 2450 
13 13 2 11/6/2010 200 . 1 2450 
14 14 2 11/8/2010 2500 . 1 5000 
15 15 2 11/8/2010 2500 . 1 5000 

這似乎是你的輸出匹配。

+0

@VineetGoti確保刷新頁面以獲取最新版本的響應。第9行是11/5在這個答案。 – MrFlick 2014-09-23 21:10:44

+0

哦,好的,謝謝。 – 2014-09-23 21:16:35

+0

非常感謝。欣賞MrFlick。 – 2014-09-23 21:22:59