如何总结数据框中列的特定单元格

时间:2016-11-30 06:54:13

标签: r dataframe

我有一个名为 BalticRainfallDuration 的数据框。数据框的一小部分如下所示。

    "TIMESTAMP"     "Rainfall"  "Duration"
2014-03-19 10:40:00     0.508   0
2014-03-19 10:50:00     1.016   10
2014-03-19 11:00:00     0.254   10
2014-03-24 09:10:00     0.254   7090
2014-03-26 12:40:00     0.254   3090
2014-03-27 11:50:00     0.254   1390
2014-03-27 12:20:00     0.254   30
2014-03-28 14:30:00     0.254   1570
2014-03-28 14:40:00     0.508   10
2014-03-28 14:50:00     0.508   10
2014-03-28 15:00:00     0.254   10
2014-03-28 15:10:00     0.508   10
2014-03-28 15:20:00     0.254   10
2014-03-28 15:40:00     0.254   20
2014-03-29 13:00:00     0.254   1280

对于TIMESTAMP中持续10分钟降雨的每个事件,我想总结那些相应事件的“持续时间”。输出数据框“Event_Duration”应如下所示:

"TIMESTAMP"        "Rainfall"     "Duration"  "Duration_sum"
2014-03-19 10:40:00     0.508             0      
2014-03-19 10:50:00     1.016            10         20         
2014-03-19 11:00:00     0.254            10
2014-03-24 09:10:00     0.254          7090         NA
2014-03-26 12:40:00     0.254          3090         NA
2014-03-27 11:50:00     0.254          1390         NA
2014-03-27 12:20:00     0.254            30         NA
2014-03-28 14:30:00     0.254          1570         NA
2014-03-28 14:40:00     0.508            10     
2014-03-28 14:50:00     0.508            10    
2014-03-28 15:00:00     0.254            10         50
2014-03-28 15:10:00     0.508            10     
2014-03-28 15:20:00     0.254            10
2014-03-28 15:40:00     0.254            20         NA
2014-03-29 13:00:00     0.254          1280         NA

这意味着持续10分钟的持续降雨事件。活动1为20分钟,活动2为50分钟。

我尝试了以下代码:

Event_Duration<-with(BalticRainfallDuraiton,diff(BalticRainfallDuraiton$TIMESTAMP)==10, sum(BalticRainfallDuraiton$Duration))

Duration_Sum<-data.frame(cbind(BalticRainfallDuration,Event_Duration))

但是在输出中我只收到TRUE或FALSE结果,而不是持续时间总和的值。 如果有人可以通过建议更正我的代码或提供替代代码来帮助我,我将非常感激。

1 个答案:

答案 0 :(得分:0)

这个怎么样:

library( dplyr )
df <- df %>%
    mutate( grp = ifelse( Duration > 10, 1, 0 ) ) %>%
    mutate( grp = cumsum( grp ) ) %>%
    group_by( grp ) %>%
    mutate( Duration_sum = c( rep( NA, n() - 1 ), sum( Duration ) - Duration[1] ) ) %>%
    ungroup() %>%
    mutate( grp = NULL )

给出了:

> df
# A tibble: 15 × 4
             TIMESTAMP Rainfall Duration Duration_sum
                <dttm>    <dbl>    <int>        <int>
1  2014-03-19 10:40:00    0.508        0           NA
2  2014-03-19 10:50:00    1.016       10           NA
3  2014-03-19 11:00:00    0.254       10           20
4  2014-03-24 09:10:00    0.254     7090            0
5  2014-03-26 12:40:00    0.254     3090            0
6  2014-03-27 11:50:00    0.254     1390            0
7  2014-03-27 12:20:00    0.254       30            0
8  2014-03-28 14:30:00    0.254     1570           NA
9  2014-03-28 14:40:00    0.508       10           NA
10 2014-03-28 14:50:00    0.508       10           NA
11 2014-03-28 15:00:00    0.254       10           NA
12 2014-03-28 15:10:00    0.508       10           NA
13 2014-03-28 15:20:00    0.254       10           50
14 2014-03-28 15:40:00    0.254       20            0
15 2014-03-29 13:00:00    0.254     1280            0

这里可能没有必要执行几个步骤,具体取决于您希望输出的样子。同样,您可能希望摆脱零持续时间值(最后只是额外的mutate步骤。)