在数据帧中的子组上循环

时间:2012-12-14 13:13:12

标签: r loops dataframe grouping subset

昨天我收到了答案,但有一件事是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 - 叶的长度
日期 - 时间 - 测量日期和时间
Tdiff - 测量之间的时间间隔(h)

我想这样做:

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

    代码:

    1. SHORT$Ttot <- ave(SHORT$Tdiff, SHORT$IDaxis, FUN = cumsum)效果很好
    2. SHORT$Ydiff <- ave(SHORT$Y, SHORT$IDaxis, FUN = diff)
    3. 我有一个问题。 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个ID轴和25个变量。

1 个答案:

答案 0 :(得分:1)

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

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

这是必要的,因为diff的输出长度短于原始矢量(差值为1)。只需将{0}添加到由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