【问题标题】:Conditional Difference of Two Rows based on Two Different Groups in RR中基于两个不同组的两行条件差
【发布时间】:2020-01-25 07:29:42
【问题描述】:

以下数据集包含每小时累积降雨量。我想通过计算连续两个小时的降雨量差异来计算每小时降雨率。

问题是每天 09:00 开始测量降雨量。因此,我想从 06/02/18 的 09 小时到 18 年 6 月 3 日的 08 小时开始寻找 hr_rain 列的两行连续行之间的差异,并且在第二天再次相同

我不能简单地从 09 小时开始,然后去寻找接下来的 24 条记录,因为在某些日子里,hr_rain 的一些观察结果丢失了。
样本数据如下:

 STATION    CODE  DATE     HOUR hr_rain
SHIVAMOGGA  163 06/09/18    00  1.0
SHIVAMOGGA  163 06/09/18    04  1.0
SHIVAMOGGA  163 06/09/18    05  1.0
SHIVAMOGGA  163 06/09/18    06  1.5
SHIVAMOGGA  163 06/09/18    07  2.5
SHIVAMOGGA  163 06/09/18    08  2.5
SHIVAMOGGA  163 06/09/18    09  0.0
SHIVAMOGGA  163 06/09/18    10  0.5
SHIVAMOGGA  163 06/09/18    11  0.5
SHIVAMOGGA  163 06/09/18    12  0.5
SHIVAMOGGA  163 06/09/18    13  0.5
SHIVAMOGGA  163 06/09/18    14  0.5
SHIVAMOGGA  163 06/09/18    15  0.5
SHIVAMOGGA  163 06/09/18    16  0.5
SHIVAMOGGA  163 06/09/18    17  0.5
SHIVAMOGGA  163 06/09/18    18  0.5
SHIVAMOGGA  163 06/09/18    19  0.5
SHIVAMOGGA  163 06/10/18    03  0.5
SHIVAMOGGA  163 06/10/18    05  0.5
SHIVAMOGGA  163 06/10/18    06  0.5
SHIVAMOGGA  163 06/10/18    07  0.5
SHIVAMOGGA  163 06/10/18    08  0.5
SHIVAMOGGA  163 06/10/18    09  0.0
SHIVAMOGGA  163 06/10/18    10  0.0

我试过了

df %>%  group_by(DATE) %>% mutate( RAINFALL = hr_rain - lag(hr_rain, default = 0))

但它确实根据DATE 进行分组,并从一天的 0 小时到一天的 23 小时给出结果,并在第二天重新开始。但我想从每天 9 点开始到第二天 8 点。 我想要的是:

STATION    CODE  DATE     HOUR hr_rain rainfall

SHIVAMOGGA  163 06/09/18    00  1.0    1
SHIVAMOGGA  163 06/09/18    04  1.0    0 
SHIVAMOGGA  163 06/09/18    05  1.0    0
SHIVAMOGGA  163 06/09/18    06  1.5    0.5 
SHIVAMOGGA  163 06/09/18    07  2.5    1 
SHIVAMOGGA  163 06/09/18    08  2.5    0
SHIVAMOGGA  163 06/09/18    09  0.0    0
SHIVAMOGGA  163 06/09/18    10  0.5    0.5 
SHIVAMOGGA  163 06/09/18    11  0.5    0
SHIVAMOGGA  163 06/09/18    12  0.5    0
SHIVAMOGGA  163 06/09/18    13  0.5    0
SHIVAMOGGA  163 06/09/18    14  0.5    0
SHIVAMOGGA  163 06/09/18    15  0.5    0
SHIVAMOGGA  163 06/09/18    16  0.5    0
SHIVAMOGGA  163 06/09/18    17  0.5    0
SHIVAMOGGA  163 06/09/18    18  0.5    0
SHIVAMOGGA  163 06/09/18    19  0.5    0
SHIVAMOGGA  163 06/10/18    03  0.5    0
SHIVAMOGGA  163 06/10/18    05  0.5    0
SHIVAMOGGA  163 06/10/18    06  0.5    0
SHIVAMOGGA  163 06/10/18    07  0.5    0
SHIVAMOGGA  163 06/10/18    08  0.5    0
SHIVAMOGGA  163 06/10/18    09  0.0    0
SHIVAMOGGA  163 06/10/18    10  0.0    0

作为 R 的初学者,我可能确实缺少一些简单的东西。我将不胜感激如何在 R 中做到这一点。

【问题讨论】:

    标签: r dplyr data.table


    【解决方案1】:

    HOUR == 9时需要创建群组

    library(dplyr)
    
    df %>%
      group_by(gr = cumsum(HOUR == 9)) %>%
      #Maybe you'll also need to add more groups
      #group_by(STATION, CODE, gr = cumsum(HOUR == 9)) %>%
      mutate(RAINFALL = hr_rain - lag(hr_rain, default = 0))
    
    #  STATION     CODE DATE      HOUR hr_rain RAINFALL
    #   <fct>      <int> <fct>    <int>   <dbl>    <dbl>
    # 1 SHIVAMOGGA   163 06/09/18     0     1        1  
    # 2 SHIVAMOGGA   163 06/09/18     4     1        0  
    # 3 SHIVAMOGGA   163 06/09/18     5     1        0  
    # 4 SHIVAMOGGA   163 06/09/18     6     1.5      0.5
    # 5 SHIVAMOGGA   163 06/09/18     7     2.5      1  
    # 6 SHIVAMOGGA   163 06/09/18     8     2.5      0  
    # 7 SHIVAMOGGA   163 06/09/18     9     0        0  
    # 8 SHIVAMOGGA   163 06/09/18    10     0.5      0.5
    # 9 SHIVAMOGGA   163 06/09/18    11     0.5      0  
    #10 SHIVAMOGGA   163 06/09/18    12     0.5      0  
    # … with 14 more rows
    

    数据

    df <- structure(list(STATION = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L), .Label = "SHIVAMOGGA", class = "factor"), CODE = c(163L, 
    163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 
    163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 
    163L), DATE = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("06/09/18", 
    "06/10/18"), class = "factor"), HOUR = c(0L, 4L, 5L, 6L, 7L, 
    8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 3L, 
    5L, 6L, 7L, 8L, 9L, 10L), hr_rain = c(1, 1, 1, 1.5, 2.5, 2.5, 
    0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 
    0.5, 0.5, 0.5, 0, 0)), class = "data.frame", row.names = c(NA, -24L))
    

    【讨论】:

    • 我按 HOUR ==9 分组,但对于 9 HOUR,其给出的结果为 9 hr_rainfall - 8 hr_rainfall(即此处给出 -2.5 而不是 0)
    • @Ajay 您的实际数据框是否与您在此处共享的数据不同,因为我认为使用此处共享的数据可以提供预期的输出。它给你同样的感觉吗?
    • 我的数据框还有两列 DISTRICT 和 TALUK。正如我在之前的评论中所说,我在 9 小时内得到 9 hr_rainfall 和 8 hr_rainfall 的差异。 (即-2.5)。
    • @Ajay 好的,这可能是因为你的环境中加载了plyr,它掩盖了mutate,试试df %&gt;% group_by(gr = cumsum(HOUR == 9)) %&gt;% dplyr::mutate(RAINFALL = hr_rain - lag(hr_rain, default = 0))
    • 我认为您无法正确粘贴 dput。最好将其添加到您的帖子中。你有HOUR 列作为整数还是字符?如果是字符,您可以尝试将group_by 语句更改为group_by(gr = cumsum(HOUR == '09'))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多