我的数据如下:
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 :(得分:2)
然后你可以得到你描述的结果,有点标准ave()
,然后是#34;最后一次观察结果"调用
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
似乎与您的输出相匹配。