【问题标题】:How to calculate the diff between dates using a condition in R如何使用 R 中的条件计算日期之间的差异
【发布时间】:2019-08-29 19:59:18
【问题描述】:

我试图找出用户有多少天没有购买产品,

我有以下 DF:

ID|  DATA     |  QTD
1 |2019-01-31 |   NA
1 |2019-02-28 |   3
1 |2019-03-31 |   NA
1 |2019-04-30 |   5
2 |2019-01-31 |   3
2 |2019-02-28 |   4
2 |2019-03-31 |   NA
2 |2019-04-30 |   NA
3 |2019-01-31 |   NA
3 |2019-02-28 |   3
3 |2019-03-31 |   NA
3 |2019-04-30 |   NA

我正在尝试使用 dplyr:mutate,但没有得到任何结果。

我的目标:

ID|  DATA     |  QTD  | Days
1 |2019-01-31 |   NA  |  NA
1 |2019-02-28 |   3   |  0
1 |2019-03-31 |   NA  |  31
1 |2019-04-30 |   5   |  0
2 |2019-01-31 |   3   |  0
2 |2019-02-28 |   4   |  0
2 |2019-03-31 |   NA  |  31
2 |2019-04-30 |   NA  |  61
3 |2019-01-31 |   NA  |  NA
3 |2019-02-28 |   NA  |  NA 
3 |2019-03-31 |   4   |  31
3 |2019-04-30 |   8   |  61

Tks

【问题讨论】:

  • 1) 使用例如dput(head(df)) 和 2) 发布可重现的数据,显示您使用的代码(不仅仅是“我试过 dplyr::mutate)。

标签: r date dplyr tidyverse cumsum


【解决方案1】:
library(dplyr)
library(tidyr)

df1 %>% 
  mutate(DATA = as.Date(DATA, "%Y-%m-%d"),
         QTD = as.numeric(as.character(QTD))) %>% 
  group_by(ID,
           ID2 = cumsum(+(if_else(is.na(QTD), 0, QTD) != 0))) %>% 
  mutate(NoBuy = cumsum(replace_na(
                                as.numeric(if_else(is.na(QTD), DATA - lag(DATA), 0))
                        , 0))) %>% 
  ungroup %>% select(-ID2)

#> Warning: NAs introduced by coercion
#> # A tibble: 12 x 4
#>       ID DATA         QTD NoBuy
#>    <dbl> <date>     <dbl> <dbl>
#>  1     1 2019-01-31    NA     0
#>  2     1 2019-02-28     3     0
#>  3     1 2019-03-31    NA    31
#>  4     1 2019-04-30     5     0
#>  5     2 2019-01-31     3     0
#>  6     2 2019-02-28     4     0
#>  7     2 2019-03-31    NA    31
#>  8     2 2019-04-30    NA    61
#>  9     3 2019-01-31    NA     0
#> 10     3 2019-02-28     3     0
#> 11     3 2019-03-31    NA    31
#> 12     3 2019-04-30    NA    61

数据:

df1 <- read.table(text="ID|  DATA     |  QTD
                        1 |2019-01-31 |   NA
                        1 |2019-02-28 |   3
                        1 |2019-03-31 |   NA
                        1 |2019-04-30 |   5
                        2 |2019-01-31 |   3
                        2 |2019-02-28 |   4
                        2 |2019-03-31 |   NA
                        2 |2019-04-30 |   NA
                        3 |2019-01-31 |   NA
                        3 |2019-02-28 |   3
                        3 |2019-03-31 |   NA
                        3 |2019-04-30 |   NA", 
                   header=T, sep="|")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2011-05-21
    • 1970-01-01
    相关资源
    最近更新 更多