【问题标题】:Difference between last time in a group and last time on previous group上一个组的最后一次和上一个组的最后一次之间的差异
【发布时间】:2020-11-03 18:38:52
【问题描述】:

我有一个数据框,其中第一列是时间,其余不同的数字变量有时具有 NA。

df <- read.table(text = 
               "Date         column_A      column_B

1               2019-10-15   5000          3500
2               2019-10-16   1000          1200
3               2019-10-17   5000          3500
4               2019-10-18   NA            1200
5               2019-10-19   NA            3500
6               2019-10-20   NA            1200
7               2019-10-21   5000          3500
8               2019-10-22   1000          1200
9               2019-10-23   5000          3500
10              2019-10-30   1000          1200
11              2019-11-01   1000          1200
12              2019-11-02   1000          1200
13              2019-11-03   1000          1200
14              2019-11-04   1000          1200
15              2019-11-05   1000          1200
" , header = TRUE)

df$Date <- as.Date.POSIXct(df$Date, tz= "Europe/Berlin")

我需要做的是及时了解每个连续值范围或 NA 的长度。目前我在做


df <- df %>% 
      mutate(Var1_interval_grp = cumsum(c(1, abs(diff(is.na(df[, column_A])))))) %>%    
      group_by(Var1_interval_grp) %>% 
      mutate(Range_Var1 = diff(range(Date))) 

这给了我组的第一个元素和最后一个元素之间的时间差,尽管我需要的是一个组的最后一个元素和前一个组的最后一个元素之间的时间差。这显然会导致第一组出现问题,因为没有前一组。

每个组 Range_Var1 的结果是 2、2 和 15,尽管我需要的是 2、3 和 16。

希望解释清楚。

提前致谢

【问题讨论】:

    标签: r dplyr group-by


    【解决方案1】:

    您可能正在寻找类似的东西:

    df %>% 
        mutate(tm = c(0, diff(Date)))%>%
        group_by(Var1_interval_grp = cumsum(c(1, abs(diff(is.na(column_A))))))%>%
        mutate(tm = sum(tm))
    # A tibble: 15 x 5
    # Groups:   Var1_interval_grp [3]
       Date       column_A column_B    tm Var1_interval_grp
       <date>        <int>    <int> <dbl>             <dbl>
     1 2019-10-15     5000     3500     2                 1
     2 2019-10-16     1000     1200     2                 1
     3 2019-10-17     5000     3500     2                 1
     4 2019-10-18       NA     1200     3                 2
     5 2019-10-19       NA     3500     3                 2
     6 2019-10-20       NA     1200     3                 2
     7 2019-10-21     5000     3500    16                 3
     8 2019-10-22     1000     1200    16                 3
     9 2019-10-23     5000     3500    16                 3
    10 2019-10-30     1000     1200    16                 3
    11 2019-11-01     1000     1200    16                 3
    12 2019-11-02     1000     1200    16                 3
    13 2019-11-03     1000     1200    16                 3
    14 2019-11-04     1000     1200    16                 3
    15 2019-11-05     1000     1200    16                 3
    

    【讨论】:

      【解决方案2】:

      我们可以使用data.table 中的rleid 来创建群组

      library(dplyr)
      library(data.table)
      df %>% 
         mutate(tm = Date - lag(Date, default = first(Date))) %>% 
         group_by(Var1_interval_grp = rleid(is.na(column_A))) %>% 
         mutate(tm = sum(tm))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-14
        • 2020-05-25
        • 2021-11-19
        • 1970-01-01
        • 2023-01-30
        相关资源
        最近更新 更多