数据帧中的逐行迭代,其中每一行取决于R中以前的行计算

数据帧中的逐行迭代,其中每一行取决于R中以前的行计算,r,R,在数据帧中,我想使用前面的行计算结果,以获得涉及其他当前行值的当前行计算结果。我还需要应用一些条件,并且必须通过维度乘积_id来完成。关键是目标列同时用于计算自身。我在Excel中复制了一个示例,它如下所示: product_id <- c(rep(1,each=9), rep(2,each=8)) dates <- c("24/09/20","25/09/20","26/09/20","27/09/20"

在数据帧中,我想使用前面的行计算结果,以获得涉及其他当前行值的当前行计算结果。我还需要应用一些条件,并且必须通过维度乘积_id来完成。关键是目标列同时用于计算自身。我在Excel中复制了一个示例,它如下所示:

product_id <- c(rep(1,each=9), rep(2,each=8))
dates <- c("24/09/20","25/09/20","26/09/20","27/09/20","28/09/20","29/09/20", "30/09/20","01/10/20","02/10/20","08/10/20","09/10/20","10/10/20","11/10/20","12/10/20","13/10/20","14/10/20","15/10/20")
date <- as.Date(dates, "%d/%m/%y")
num_day <- c(1:9, 1:8)
production <- c(rep(4,each=9), rep(3.5,each=8))
demand <- c(0,0,3,1,3,20,0,1,3,0,1,2,5,0,15,1,3)


df <- data.frame (product_id,date,num_day,production,demand)


product\u id在找到更优雅的解决方案之前,您可以执行以下操作

library(dplyr)

df %>%
  group_by(product_id) %>%
  mutate(group = if_else(cumsum(production-demand) < 0 | 
                         num_day == min(num_day), 1, 0)) %>%
  ungroup() %>%
  mutate(group = if_else(group != 0, row_number(), as.integer(0)),
         group = cumsum(group)) %>%
  group_by(group) %>%
  mutate(modDiff = if_else(num_day == min(num_day), 0, production-demand)) %>%
  ungroup() %>%
  group_by(product_id) %>%
  mutate(modDiff = if_else(num_day == min(num_day), production-demand, modDiff),
         modDiff = if_else(num_day == min(num_day) & modDiff < 0, 0, modDiff)) %>%
  group_by(group) %>%
  mutate(stock = cumsum(modDiff)) %>%
  ungroup() %>%
  select(-modDiff, -group)

# # A tibble: 17 x 6
# product_id          date num_day production demand stock
# <dbl>             <date>   <int>      <dbl>  <dbl> <dbl>
# 1           1 2020-09-24       1        4        0   4  
# 2           1 2020-09-25       2        4        0   8  
# 3           1 2020-09-26       3        4        3   9  
# 4           1 2020-09-27       4        4        1  12  
# 5           1 2020-09-28       5        4        3  13  
# 6           1 2020-09-29       6        4       20   0  
# 7           1 2020-09-30       7        4        0   4  
# 8           1 2020-10-01       8        4        1   7  
# 9           1 2020-10-02       9        4        3   8  
# 10          2 2020-10-08       1        3.5      0   3.5
# 11          2 2020-10-09       2        3.5      1   6  
# 12          2 2020-10-10       3        3.5      2   7.5
# 13          2 2020-10-11       4        3.5      5   6  
# 14          2 2020-10-12       5        3.5      0   9.5
# 15          2 2020-10-13       6        3.5     15   0  
# 16          2 2020-10-14       7        3.5      1   2.5
# 17          2 2020-10-15       8        3.5      3   3  
库(dplyr)
df%>%
分组依据(产品id)%>%
突变(组=如果其他(总和(生产需求)<0)
num_day==min(num_day),1,0))%>%
解组()%>%
mutate(group=if_else(group!=0,row_number(),as.integer(0)),
组=总和(组))%>%
分组依据(分组)%>%
变异(modDiff=if_-else(num_-day==min(num_-day),0,生产需求))%>%
解组()%>%
分组依据(产品id)%>%
变异(modDiff=if_-else(num_-day==min(num_-day)),生产需求,modDiff,
modDiff=if_else(num_day==min(num_day)&modDiff<0,0,modDiff))%>%
分组依据(分组)%>%
突变(股票=累积(modDiff))%>%
解组()%>%
选择(-modDiff,-组)
##tibble:17 x 6
#产品id日期天数生产需求库存
#                          
# 1           1 2020-09-24       1        4        0   4  
# 2           1 2020-09-25       2        4        0   8  
# 3           1 2020-09-26       3        4        3   9  
# 4           1 2020-09-27       4        4        1  12  
# 5           1 2020-09-28       5        4        3  13  
# 6           1 2020-09-29       6        4       20   0  
# 7           1 2020-09-30       7        4        0   4  
# 8           1 2020-10-01       8        4        1   7  
# 9           1 2020-10-02       9        4        3   8  
# 10          2 2020-10-08       1        3.5      0   3.5
# 11          2 2020-10-09       2        3.5      1   6  
# 12          2 2020-10-10       3        3.5      2   7.5
# 13          2 2020-10-11       4        3.5      5   6  
# 14          2 2020-10-12       5        3.5      0   9.5
# 15          2 2020-10-13       6        3.5     15   0  
# 16          2 2020-10-14       7        3.5      1   2.5
# 17          2 2020-10-15       8        3.5      3   3  

这可以使用
purrr
累计
轻松完成:

df%>%
分组依据(产品id)%>%
突变(库存=累积(生产-需求,~max(.x+.y,0)))%>%
解组()
结果:

# A tibble: 17 x 6
# Groups:   product_id [2]
   product_id date       num_day production demand stock
        <dbl> <date>       <int>      <dbl>  <dbl> <dbl>
 1          1 2020-09-24       1        4        0   4  
 2          1 2020-09-25       2        4        0   8  
 3          1 2020-09-26       3        4        3   9  
 4          1 2020-09-27       4        4        1  12  
 5          1 2020-09-28       5        4        3  13  
 6          1 2020-09-29       6        4       20   0  
 7          1 2020-09-30       7        4        0   4  
 8          1 2020-10-01       8        4        1   7  
 9          1 2020-10-02       9        4        3   8  
10          2 2020-10-08       1        3.5      0   3.5
11          2 2020-10-09       2        3.5      1   6  
12          2 2020-10-10       3        3.5      2   7.5
13          2 2020-10-11       4        3.5      5   6  
14          2 2020-10-12       5        3.5      0   9.5
15          2 2020-10-13       6        3.5     15   0  
16          2 2020-10-14       7        3.5      1   2.5
17          2 2020-10-15       8        3.5      3   3  
#一个tible:17 x 6
#分组:产品编号[2]
产品id日期天数生产需求库存
1          1 2020-09-24       1        4        0   4  
2          1 2020-09-25       2        4        0   8  
3          1 2020-09-26       3        4        3   9  
4          1 2020-09-27       4        4        1  12  
5          1 2020-09-28       5        4        3  13  
6          1 2020-09-29       6        4       20   0  
7          1 2020-09-30       7        4        0   4  
8          1 2020-10-01       8        4        1   7  
9          1 2020-10-02       9        4        3   8  
10          2 2020-10-08       1        3.5      0   3.5
11          2 2020-10-09       2        3.5      1   6  
12          2 2020-10-10       3        3.5      2   7.5
13          2 2020-10-11       4        3.5      5   6  
14          2 2020-10-12       5        3.5      0   9.5
15          2 2020-10-13       6        3.5     15   0  
16          2 2020-10-14       7        3.5      1   2.5
17          2 2020-10-15       8        3.5      3   3  
结果与您的和@rjen的匹配,因此我相对确信这是正确的


说明:使用
累计
,简单的累计和可以实现为
累计(生产-需求,~.x+.y)
(甚至更短为
累计(生产-需求,`+`)
)。在此处使用
max
函数可确保结果永远不会低于0,这是您想要的结果。

请使用
dput(数据)
并在您的主要问题中发布输出,而不是发布您数据的图像-这会使其他人更容易复制您的代码。另外,请给出所需输出的示例。对不起@user438383,这是我第一次在这里发布,我将为下一次编写示例代码和所需输出。解决方案现在适用于所有情况。非常感谢@shizundeiku,很好的解释和真正优化的代码!!