R:如何在计算中使用列中的第一个值,然后将其转换为以下行的结果

时间:2018-10-10 21:37:52

标签: r algorithm

这是数据示例:

df <- data.frame(
  dept = c(rep('FIREDEPT', 5), rep('WATERDEPT', 5)),
  month = 201808:201812,
  initial_stock = sample(75884:85347, 10),
  variable_predicted = sample(50000:100000, 10),
  variable2_predicted= sample(1:100, 10) / 100)

我需要创建一个名为“ predicted_stock”的新字段,并且需要按部门使用以下计算:

  • 如果月份是第一个月,则计算initial_stock + variable_predicted * variable2_predicted
  • 如果不是第一个月份,则使用先前的Forecast_stock + variable_predicted * variable2_predicted

我只能考虑使用for循环方法来执行此操作,但我认为这不是很聪明...进行此计算的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

我能够使用@ user2738526发布它。不要认为这仍然是最佳方法,但是比我最初尝试做的要好。

library(dplyr)
library(data.table)
# if first month, than use intial stock
# I "recalculate" the initial_stock, 
# this is specific to the real scenario
df <- df %>% mutate(initial_stock = 
                      ifelse(month == min(month), 
                        initial_stock, 
                        0
                        )
                    )

# calculate the predicted stock using cumsum
df <- df %>% group_by(DEPTO) %>% mutate(predicted_stock =
                                          cumsum(
                                            initial_stock 
                                            + variable_predicted * variable2_predicted
                                          )
                                        )
# "recalculation" of the initial_sock is updated
# this is specific to the real scenario
df <- df %>% group_by(DEPTO) %>% mutate(initial_sock = 
                                        ifelse(month == min(month), 
                                            initial_stock , 
                                            shift(predicted_stock, type = "lag")
                                            )
                                        )

答案 1 :(得分:0)

根据您的df是否总是按每个部门的第一行作为您想要不同的行进行排序,则可以使用以下任一方法:

library(dplyr) 
df %>% group_by(dept) %>% mutate(predicted_stock= ifelse(row_number()==1, "CalcA", "CalcB"))
df %>% group_by(dept) %>% mutate(predicted_stock= ifelse(month==min(month), "CalcA", "CalcB"))

我假设您可以填写计算内容,因为您给出的方程式不使用您提供的示例列。

欢呼