计算R中两个非零需求之间的间隔期
Calculate interval period between two non zero demands in R
我有以下数据时间序列数据 - 列 Model Month Year Quantity,我想在名为 DemandInterval 的数据框中创建一个 column/new 变量(如下所示),它计算 使用 R 代码在两个非零数量之间的需求间隔。
Model Month Year Quantity DemandInterval
Model-A 7 2017 0 0
Model-A 8 2017 1 1
Model-A 9 2017 1 1
Model-A 10 2017 1 1
Model-A 11 2017 0 0
Model-A 12 2017 0 0
Model-A 1 2018 0 0
Model-A 2 2018 0 0
Model-A 3 2018 0 0
Model-A 4 2018 1 6
Model-A 5 2018 5 1
Model-A 6 2018 0 0
Model-A 7 2018 0 0
Model-A 8 2018 0 0
Model-A 9 2018 1 4
Model-A 10 2018 0 0
Model-A 11 2018 1 2
Model-A 12 2018 0 0
Model-A 1 2019 1 2
Model-A 2 2019 1 1
Model-A 3 2019 0 0
Model-A 4 2019 0 0
Model-A 5 2019 2 3
Model-A 6 2019 0 0
Model-A 7 2019 0 0
Model-A 8 2019 1 3
Model-A 9 2019 1 1
Model-A 10 2019 0 0
Model-A 11 2019 1 2
Model-A 12 2019 1 1
Model-A 1 2020 0 0
Model-A 2 2020 0 0
Model-A 3 2020 1 3
Model-A 4 2020 1 1
Model-A 5 2020 3 1
Model-A 6 2020 1 1
如果有人能帮助我,我会很高兴。谢谢
这是一个 dplyr
解决方案。它的工作原理是过滤掉所有数量为零的行,然后找到剩余行之间的间隔。然后 left_join
返回到原始数据框。这些数字都将是正确的,除了数量为 0 的数字,它们将是 NA
。这些只是更改为零 ifelse
:
library(dplyr)
(df %>% left_join(
df %>% filter(Quantity != 0) %>%
mutate(DemandInterval = c(1, diff(Year * 12 + Month))), by = names(df))) %>%
mutate(DemandInterval = ifelse(is.na(DemandInterval), 0, DemandInterval))
#> Model Month Year Quantity DemandInterval
#> 1 Model-A 7 2017 0 0
#> 2 Model-A 8 2017 1 1
#> 3 Model-A 9 2017 1 1
#> 4 Model-A 10 2017 1 1
#> 5 Model-A 11 2017 0 0
#> 6 Model-A 12 2017 0 0
#> 7 Model-A 1 2018 0 0
#> 8 Model-A 2 2018 0 0
#> 9 Model-A 3 2018 0 0
#> 10 Model-A 4 2018 1 6
#> 11 Model-A 5 2018 5 1
#> 12 Model-A 6 2018 0 0
#> 13 Model-A 7 2018 0 0
#> 14 Model-A 8 2018 0 0
#> 15 Model-A 9 2018 1 4
#> 16 Model-A 10 2018 0 0
#> 17 Model-A 11 2018 1 2
#> 18 Model-A 12 2018 0 0
#> 19 Model-A 1 2019 1 2
#> 20 Model-A 2 2019 1 1
#> 21 Model-A 3 2019 0 0
#> 22 Model-A 4 2019 0 0
#> 23 Model-A 5 2019 2 3
#> 24 Model-A 6 2019 0 0
#> 25 Model-A 7 2019 0 0
#> 26 Model-A 8 2019 1 3
#> 27 Model-A 9 2019 1 1
#> 28 Model-A 10 2019 0 0
#> 29 Model-A 11 2019 1 2
#> 30 Model-A 12 2019 1 1
#> 31 Model-A 1 2020 0 0
#> 32 Model-A 2 2020 0 0
#> 33 Model-A 3 2020 1 3
#> 34 Model-A 4 2020 1 1
#> 35 Model-A 5 2020 3 1
#> 36 Model-A 6 2020 1 1
我有以下数据时间序列数据 - 列 Model Month Year Quantity,我想在名为 DemandInterval 的数据框中创建一个 column/new 变量(如下所示),它计算 使用 R 代码在两个非零数量之间的需求间隔。
Model Month Year Quantity DemandInterval
Model-A 7 2017 0 0
Model-A 8 2017 1 1
Model-A 9 2017 1 1
Model-A 10 2017 1 1
Model-A 11 2017 0 0
Model-A 12 2017 0 0
Model-A 1 2018 0 0
Model-A 2 2018 0 0
Model-A 3 2018 0 0
Model-A 4 2018 1 6
Model-A 5 2018 5 1
Model-A 6 2018 0 0
Model-A 7 2018 0 0
Model-A 8 2018 0 0
Model-A 9 2018 1 4
Model-A 10 2018 0 0
Model-A 11 2018 1 2
Model-A 12 2018 0 0
Model-A 1 2019 1 2
Model-A 2 2019 1 1
Model-A 3 2019 0 0
Model-A 4 2019 0 0
Model-A 5 2019 2 3
Model-A 6 2019 0 0
Model-A 7 2019 0 0
Model-A 8 2019 1 3
Model-A 9 2019 1 1
Model-A 10 2019 0 0
Model-A 11 2019 1 2
Model-A 12 2019 1 1
Model-A 1 2020 0 0
Model-A 2 2020 0 0
Model-A 3 2020 1 3
Model-A 4 2020 1 1
Model-A 5 2020 3 1
Model-A 6 2020 1 1
如果有人能帮助我,我会很高兴。谢谢
这是一个 dplyr
解决方案。它的工作原理是过滤掉所有数量为零的行,然后找到剩余行之间的间隔。然后 left_join
返回到原始数据框。这些数字都将是正确的,除了数量为 0 的数字,它们将是 NA
。这些只是更改为零 ifelse
:
library(dplyr)
(df %>% left_join(
df %>% filter(Quantity != 0) %>%
mutate(DemandInterval = c(1, diff(Year * 12 + Month))), by = names(df))) %>%
mutate(DemandInterval = ifelse(is.na(DemandInterval), 0, DemandInterval))
#> Model Month Year Quantity DemandInterval
#> 1 Model-A 7 2017 0 0
#> 2 Model-A 8 2017 1 1
#> 3 Model-A 9 2017 1 1
#> 4 Model-A 10 2017 1 1
#> 5 Model-A 11 2017 0 0
#> 6 Model-A 12 2017 0 0
#> 7 Model-A 1 2018 0 0
#> 8 Model-A 2 2018 0 0
#> 9 Model-A 3 2018 0 0
#> 10 Model-A 4 2018 1 6
#> 11 Model-A 5 2018 5 1
#> 12 Model-A 6 2018 0 0
#> 13 Model-A 7 2018 0 0
#> 14 Model-A 8 2018 0 0
#> 15 Model-A 9 2018 1 4
#> 16 Model-A 10 2018 0 0
#> 17 Model-A 11 2018 1 2
#> 18 Model-A 12 2018 0 0
#> 19 Model-A 1 2019 1 2
#> 20 Model-A 2 2019 1 1
#> 21 Model-A 3 2019 0 0
#> 22 Model-A 4 2019 0 0
#> 23 Model-A 5 2019 2 3
#> 24 Model-A 6 2019 0 0
#> 25 Model-A 7 2019 0 0
#> 26 Model-A 8 2019 1 3
#> 27 Model-A 9 2019 1 1
#> 28 Model-A 10 2019 0 0
#> 29 Model-A 11 2019 1 2
#> 30 Model-A 12 2019 1 1
#> 31 Model-A 1 2020 0 0
#> 32 Model-A 2 2020 0 0
#> 33 Model-A 3 2020 1 3
#> 34 Model-A 4 2020 1 1
#> 35 Model-A 5 2020 3 1
#> 36 Model-A 6 2020 1 1