根据R中的某些条件创建列

时间:2014-09-23 20:20:50

标签: 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列的值,那将会很棒。谢谢。

1 个答案:

答案 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

似乎与您的输出相匹配。