【问题标题】:loop on subgroups in dataframe循环数据框中的子组
【发布时间】:2012-12-02 11:53:51
【问题描述】:

我昨天收到了答复,但有一件事不是 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 - 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 个变量。

【问题讨论】:

  • 请始终输入您的数据 :)

标签: r loops dataframe grouping subset


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-01-29
    • 2021-06-21
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 2021-05-06
    • 2018-08-20
    相关资源
    最近更新 更多