这是数据的示例:
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
- 如果月份不是第一个,则使用上一个predicted_stock + variable_predicted * variable2_predicted
我只能想到用 for 循环方法做到这一点,但我认为这不是很聪明......进行此计算的最佳方法是什么?
我能够使用@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")
)
)
根据你的 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"))
我假设您可以填写计算内容,因为您给出的方程式不使用您提供的示例列。
干杯