【问题标题】:Calculating days difference on rolling basis depending on another column根据另一列计算滚动天数差异
【发布时间】:2018-10-18 07:18:34
【问题描述】:

我正在尝试使用 dplyr 创建一个计算列,以滚动获取参考日期(当前)和未来日期之间的天数差异。例如,我有一个数据框,例如-

sample = data.frame(dates = seq(today(), today() + weeks(3), by = 1), qty = 
         floor(100 * rnorm(22)))

我想要实现的是创建一个新列,比如 days_to 如果数量 >=0 则为 0。但是,如果 qty

dates       qty days_to
10/17/2018  175 0
10/18/2018  -69 2
10/19/2018  -20 1
10/20/2018  113 0
10/21/2018  7   0
10/22/2018  120 0
10/23/2018  48  0
10/24/2018  -31 NA
10/25/2018  -9  NA
10/26/2018  -87 NA

我需要对分组变量上的大量行(~2M)执行此操作,因此尝试使用 dplyr 来实现此目的。任何帮助表示赞赏。

谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    dplyr

    library(dplyr)
    sampledplyr <- sample %>%
      mutate(grp = cumsum(qty > 0 & lag(qty) < 0)) %>%
      group_by(grp) %>%
      mutate(days_to = if_else(qty < 0, n() - row_number() + 1L, 0L)) %>%
      ungroup() %>%
      select(-grp)
    print(sampledplyr, n=22)
    # # A tibble: 22 x 3
    #    dates        qty days_to
    #    <date>     <dbl>   <int>
    #  1 2018-10-17   -63       1
    #  2 2018-10-18    18       0
    #  3 2018-10-19   -84       1
    #  4 2018-10-20   159       0
    #  5 2018-10-21    32       0
    #  6 2018-10-22   -83       1
    #  7 2018-10-23    48       0
    #  8 2018-10-24    73       0
    #  9 2018-10-25    57       0
    # 10 2018-10-26   -31       1
    # 11 2018-10-27   151       0
    # 12 2018-10-28    38       0
    # 13 2018-10-29   -63       2
    # 14 2018-10-30  -222       1
    # 15 2018-10-31   112       0
    # 16 2018-11-01    -5       2
    # 17 2018-11-02    -2       1
    # 18 2018-11-03    94       0
    # 19 2018-11-04    82       0
    # 20 2018-11-05    59       0
    # 21 2018-11-06    91       0
    # 22 2018-11-07    78       0
    

    data.table

    library(data.table)
    sampledt <- as.data.table(sample)
    sampledt[,days_to := ifelse(qty < 0, .N - seq_len(nrow(.SD)) + 1L, 0L),
             by = cumsum(qty > 0 & lag(qty) < 0)]
    

    (相同的输出。)


    数据:

    set.seed(1) # alway
    sample = data.frame(dates = seq(Sys.Date(), Sys.Date() + 3*7, by = 1),
                        qty = floor(100 * rnorm(22)))
    

    【讨论】:

    • 此解决方案适用于我提供的示例,但如果日期之间有不规则的间隔,则会失败。
    • dates 字段从未使用过,它们为什么重要?您需要先订购数据吗?
    • 否,但在日期不规则的情况下,days_to 将成为前面的索引或行数。然后,您需要获取该索引上的日期并减去它。我想我没有在问题中说清楚,你的解决方案是朝着这个方向迈出的一步,所以很好。感谢您的帮助!
    • 好的,我没有从问题中明白这一点,我现在明白你的意思了。您需要发布代表性数据以获得更多帮助。也许找到一个随机种子,它会呈现您所看到的问题。提供那个种子(以及要生成的代码,如果与上面不同),我会看看。
    猜你喜欢
    • 2020-12-29
    • 2018-05-31
    • 1970-01-01
    • 2015-12-30
    • 2021-12-31
    • 2020-02-19
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    相关资源
    最近更新 更多