R 根据其他列计算滚动日差

R 根据其他列计算滚动日差,r,dplyr,R,Dplyr,我试图使用dplyr创建一个计算列,以滚动方式获得参考日期(当前)和未来日期之间的天数差。例如,我有一个数据帧,如- sample = data.frame(dates = seq(today(), today() + weeks(3), by = 1), qty = floor(100 * rnorm(22))) 我想要实现的是创建一个新列,比如days\u,如果qty>=0,则该列将为0。但是,如果数量

我试图使用dplyr创建一个计算列,以滚动方式获得参考日期(当前)和未来日期之间的天数差。例如,我有一个数据帧,如-

sample = data.frame(dates = seq(today(), today() + weeks(3), by = 1), qty = 
         floor(100 * rnorm(22)))
我想要实现的是创建一个新列,比如days\u,如果qty>=0,则该列将为0。但是,如果数量<0,则天数应为数量超过0的天数。如果未来任何日期的数量未超过0,则天数=NA/Inf(不重要)。因此,对于上面的示例,它应该类似于-

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来实现这一点。感谢您的帮助

谢谢

dplyr
(输出相同。)


数据:

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
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)))