【问题标题】:loop in data frame在数据框中循环
【发布时间】:2012-12-13 11:34:52
【问题描述】:

这是我的数据框 SHORT:

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) 测量间隔

我想做(示例 SHORT1):
1) 在 SHORT$Ttot 列中总结 IDaxis 的 Tdiff
2) 计算 SHORT$Ydiff 列中 IDaxis 的 Y 行之间的差异
3) 在 SHORT$Ytot 列中为 IDaxis 总结 Ydiff

示例 SHORT1:

Ydiff - 测量之间的长度间隔
Ytot - 从测量到测量的长度间隔之和
Ttot - 从测量到测量的时间间隔总和

如果我拆分数据框,我知道如何为 IDaxis 计算此值。我的问题是我有三个数据框,每个 700 ID,每个都有 100 IDaxis。我不知道如何为整个数据框自动执行此操作。提前谢谢你。

【问题讨论】:

标签: r if-statement for-loop


【解决方案1】:

你可以使用ave:

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

(如果您不喜欢重复的SHORT$,请查看transform 之类的函数。)

您也可以使用方便的plyr 包:

library(plyr)
ddply(SHORT, "IDaxis", transform, Ttot  = cumsum(Tdiff),
                                  Ydiff = diff(Y),
                                  Ytot  = cumsum(Ydiff))

【讨论】:

  • 太棒了。这是工作 !!!非常感谢你。我大约在 4 周前开始使用 R,但我还有很多其他的东西。我将在 1 月和 2 月有时间只关注 R。
【解决方案2】:

使用聚合()和合并()。

这里是聚合http://www.statmethods.net/management/aggregate.html的链接

【讨论】:

    猜你喜欢
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    相关资源
    最近更新 更多