0

我昨天收到了答复,但有一件事不是 100% 正确的。我的数据框简短:

ID  IDaxis  Y   Date-Time               Tdiff  
1   1       5   2012-06-11  13:10:30    0.00    
1   1       10  2012-06-11  15:10:30    2.00    
1   1       20  2012-06-11  17:10:30    2.00    
1   3       15  2012-06-11  13:20:30    0.00    
1   3       30  2012-06-11  14:20:30    1.00    
1   3       45  2012-06-11  17:20:30    3.00    
1   6       9   2012-06-11  13:35:30    0.00        
1   6       15  2012-06-11  15:35:30    2.00    
1   6       30  2012-06-11  18:35:30    3.00    
3   2       8   2012-06-11  13:50:30    0.00  
3   2       14  2012-06-11  14:55:30    1.083   
3   2       20  2012-06-11  16:55:30    2.00    
3   2       30  2012-06-11  19:00:30    2.083   
3   5       10  2012-06-11  13:40:30    0.00    
3   5       15  2012-06-11  16:45:30    3.083

ID - 植物
IDaxis - 植物叶片
Y - 叶长
Date - Time - 测量日期和时间
Tdiff - time(h) 测量间隔

我想要做:

  1. 在 SHORT$Ttot 列中汇总 IDaxis 的 Tdiff
  2. 计算 SHORT$Ydiff 列中 IDaxis 的 Y 行之间的差异
  3. 总结 SHORT$Ytot 列中 IDaxis 的 Ydiff

代码:

  1. SHORT$Ttot <- ave(SHORT$Tdiff, SHORT$IDaxis, FUN = cumsum)效果很好
  2. SHORT$Ydiff <- ave(SHORT$Y, SHORT$IDaxis, FUN = diff)

在这里我有一个问题。Ydiff 应该看起来像这样(新 IDxais 的第一行等于=0):

ID  IDaxis  Y   Ydiff
1   1       5   0
1   1       10  5
1   1       20  10
1   3       15  0
1   3       30  15
1   3       45  15
1   6       9   0

但是 Ydiff 看起来像这样:

ID  IDaxis  Y   Ydiff
1   1       5   5
1   1       10  10
1   1       20  -5
1   3       15  15
1   3       30  15
1   3       45  15
1   6       9  -36

这搞砸了所有代码:

3.SHORT$Ytot <- ave(SHORT$Ydiff, SHORT$IDaxis, FUN = cumsum)

如果您可以用一段代码来回答,那将非常有帮助。
我刚刚开始使用 R,但这是我的数据框的简化版本 - 只是为了显示问题。我有三个数据框,每个 700 ID,每个都有 100 IDaxis 和 25 个变量。

4

1 回答 1

1

您必须将第二个ave命令中的函数更改为:

function(x) c(0, diff(x))

这是必要的,因为 的输出diff长度比原始向量短(差为 1)。只需将零添加到由diff. 这确保每个子组的第一个值为零。

完整代码:

SHORT$Ttot <- ave(SHORT$Tdiff, SHORT$IDaxis, FUN = cumsum)
SHORT$Ydiff <- ave(SHORT$Y, SHORT$IDaxis, FUN = function(x) c(0, diff(x)))
SHORT$Ytot <- ave(SHORT$Ydiff, SHORT$IDaxis, FUN = cumsum)

结果:

   ID IDaxis  Y            Date.Time Tdiff  Ttot Ydiff Ytot
1   1      1  5 2012-06-11  13:10:30 0.000 0.000     0    0
2   1      1 10 2012-06-11  15:10:30 2.000 2.000     5    5
3   1      1 20 2012-06-11  17:10:30 2.000 4.000    10   15
4   1      3 15 2012-06-11  13:20:30 0.000 0.000     0    0
5   1      3 30 2012-06-11  14:20:30 1.000 1.000    15   15
6   1      3 45 2012-06-11  17:20:30 3.000 4.000    15   30
7   1      6  9 2012-06-11  13:35:30 0.000 0.000     0    0
8   1      6 15 2012-06-11  15:35:30 2.000 2.000     6    6
9   1      6 30 2012-06-11  18:35:30 3.000 5.000    15   21
10  3      2  8 2012-06-11  13:50:30 0.000 0.000     0    0
11  3      2 14 2012-06-11  14:55:30 1.083 1.083     6    6
12  3      2 20 2012-06-11  16:55:30 2.000 3.083     6   12
13  3      2 30 2012-06-11  19:00:30 2.083 5.166    10   22
14  3      5 10 2012-06-11  13:40:30 0.000 0.000     0    0
15  3      5 15 2012-06-11  16:45:30 3.083 3.083     5    5
于 2012-12-17T10:40:59.593 回答