【问题标题】:Create a column based on certain conditions in R根据R中的某些条件创建列
【发布时间】:2014-09-24 13:58:59
【问题描述】:

我的数据如下所示:

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 列的值,那就太好了。谢谢。

【问题讨论】:

  • CO 和 TDD 值之间没有相关性。 CO 值是我任意选择的。我只是想表明,当 CO 取一个值时,需要重置 TDD 的计算。您所指的 TDD 值 1700 是第 6 行和第 7 行的 DO 值之和。TDD 值 2450 是第 11、12 和 13 行的 DO 值之和。
  • 弗利克先生,对不起。对于输入中第 7 行的 DATE,它应该是 11/2/2010。我该如何纠正上面的错误?
  • MrFlick 第 9 行和第 10 行不应该是同一天。
  • @MrFlick :这是参考您对第 9 行和第 10 行的评论。由于 DO 值未在 2010 年 11 月 6 日记录,即在 2010 年 11 月 6 日记录 CO 值之前, 2010 年 11 月 5 日的 DO 值将用于计算第 10 行的 TDD 值。因此,为了纠正自己,具有 CO 值的行的 TDD 值将始终是前一行中的 TDD 值。
  • 你真的很喜欢让事情变得困难,不是吗;)我已经更新了我的答案。

标签: r


【解决方案1】:

然后你可以通过一个有点标准的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

这似乎与您的输出相匹配。

【讨论】:

  • @VineetGoti 确保刷新页面以获取最新版本的响应。在这个答案中,第 9 行是 11/5。
  • 非常感谢。欣赏它 MrFlick。
  • 我有 R 3.1,并且包 zoo 不适用于 R 3.1。您能否修改代码以使我不必使用动物园库。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
相关资源
最近更新 更多