按以下方法计算销售额

时间:2018-04-11 12:23:33

标签: r loops dataframe

我有一些销售计算,并根据给定的公式定义一些基本的预测销售额。

df1:cut_of_sales

cut-off_sales
    1
    2
    1
    3

df2:数据的实际df:

Sales
NA
NA
NA
NA
1.2    
2.1
1.4
1.1
2.1
1.4
1.1
1.2
2.1
1.4
1.1
1.2
2.1
1.4
1.1
2.3

前四个季度是NA。保持原样。 从第5行开始,添加cutoff_sales的第一个值

Explanation: 
1. cutoff_sales is given predefined by the company, 4 values for each quaters are given. 

2. Add the q1 quarter of the cutoff sales with 2010q1 = ansq1

3. Add the q2 quater of the cutoff sales with 2010q2 = ansq2

4. Do the same for q3 and q4. 

Now the answer of above addition will, will be input for next 2011 quaters. 

so ansq1 + 2012q1 = ans...
ansq2 + 2012q2 = ans ....
and so on for below quarter answer for 2012 quaters will be input for 2013 and so on for rest of the 10 years.

请帮助我做这个补充。

我只能在第一年加入。

请帮助我编写一个函数或循环,这将是迭代的,因为会有很多年的时间。

感谢。

2 个答案:

答案 0 :(得分:4)

有关更新的问题

通过更新的问题,以下是实现任务的一种方法。由于这是四分之一数据且前四行是NA,因此您可以先在cut_off中将mydf1的值添加到Sales。然后,您创建一个分组变量。 1表示第一季度。您可以按照我之前的回答中的建议,将Salescumsum()相加。看来你想保留这些NAs。所以我最后将0转换为NA

mydf2$Sales[5:8] <- mydf2$Sales[5:8] + mydf1$cut_off

group_by(mydf2, quarter = rep(1:4, times = n()/4)) %>%
mutate(Sales = cumsum(if_else(is.na(Sales), 0, Sales)),
       Sales = na_if(Sales, 0))

   Sales quarter
   <dbl>   <int>
 1 NA          1
 2 NA          2
 3 NA          3
 4 NA          4
 5  2.20       1
 6  4.10       2
 7  2.40       3
 8  4.10       4
 9  4.30       1
10  5.50       2
11  3.50       3
12  5.30       4
13  6.40       1
14  6.90       2
15  4.60       3
16  6.50       4
17  8.50       1
18  8.30       2
19  5.70       3
20  8.80       4

数据

mydf2 <- structure(list(Sales = c(NA, NA, NA, NA, 2.2, 4.1, 2.4, 4.1, 
2.1, 1.4, 1.1, 1.2, 2.1, 1.4, 1.1, 1.2, 2.1, 1.4, 1.1, 2.3)), .Names = "Sales", row.names = c(NA, 
-20L), class = "data.frame")

原始问题

这是一种方法。我考虑过你的数据中会有NA的情况。首先,我在cut_off中添加了mydf1的值。然后,我创建了一个名为quarter的新变量并定义了组。对于每个组,我应用cumsum()并总结了值。如果您没有任何NA,则下面的代码中的最后一行将是mutate(sales = cumsum(sales))

library(dplyr)

mydf2 %>%
mutate(sales = if_else(substr(sales_quarter, 1,4) == "2010", sales + mydf1$cut_off, sales)) %>%
group_by(quarter = substr(sales_quarter, 5, 6)) %>%
mutate(sales = cumsum(if_else(is.na(sales), 0, sales)))

   sales_quarter sales quarter
   <chr>         <dbl> <chr>  
 1 2010Q1         2.20 Q1     
 2 2010Q2         4.10 Q2     
 3 2010Q3         2.40 Q3     
 4 2010Q4         4.10 Q4     
 5 2011Q1         4.30 Q1     
 6 2011Q2         5.50 Q2     
 7 2011Q3         3.50 Q3     
 8 2011Q4         5.30 Q4     
 9 2012Q1         6.40 Q1     
10 2012Q2         6.90 Q2     
11 2012Q3         4.60 Q3     
12 2012Q4         6.50 Q4     
13 2013Q1         8.50 Q1     
14 2013Q2         8.30 Q2     
15 2013Q3         5.70 Q3     
16 2013Q4         8.80 Q4     

数据

mydf1 <- structure(list(cut_off = c(1, 2, 1, 3)), .Names = "cut_off", row.names = c(NA, 
4L), class = "data.frame")

mydf2 <- structure(list(sales_quarter = c("2010Q1", "2010Q2", "2010Q3", 
"2010Q4", "2011Q1", "2011Q2", "2011Q3", "2011Q4", "2012Q1", "2012Q2", 
"2012Q3", "2012Q4", "2013Q1", "2013Q2", "2013Q3", "2013Q4"), 
sales = c(1.2, 2.1, 1.4, 1.1, 2.1, 1.4, 1.1, 1.2, 2.1, 1.4, 
1.1, 1.2, 2.1, 1.4, 1.1, 2.3)), .Names = c("sales_quarter", 
"sales"), class = "data.frame", row.names = c(NA, -16L))

答案 1 :(得分:1)

新的顺序回答:

> df
   year_quater sales pred_sales
1       2010Q1   1.2         NA
2       2010Q2   2.1         NA
3       2010Q3   1.4         NA
4       2010Q4   1.1         NA
5       2011Q1   2.1         NA
6       2011Q2   1.4         NA
7       2011Q3   1.1         NA
8       2011Q4   1.2         NA
9       2012Q1   2.1         NA
10      2012Q2   1.4         NA
11      2012Q3   1.1         NA
12      2012Q4   1.2         NA
13      2013Q1   2.1         NA
14      2013Q2   1.4         NA
15      2013Q3   1.1         NA
16      2013Q4   2.3         NA

pred <- c(1,2,1,3)

for(i in seq(1, nrow(df), 4)){
  df$pred_sales[i:(i+3)] <- df$sales[i:(i+3)] + pred
  pred <- df$pred_sales[i:(i+3)]
}

> df
   year_quater sales pred_sales
1       2010Q1   1.2        2.2
2       2010Q2   2.1        4.1
3       2010Q3   1.4        2.4
4       2010Q4   1.1        4.1
5       2011Q1   2.1        4.3
6       2011Q2   1.4        5.5
7       2011Q3   1.1        3.5
8       2011Q4   1.2        5.3
9       2012Q1   2.1        6.4
10      2012Q2   1.4        6.9
11      2012Q3   1.1        4.6
12      2012Q4   1.2        6.5
13      2013Q1   2.1        8.5
14      2013Q2   1.4        8.3
15      2013Q3   1.1        5.7
16      2013Q4   2.3        8.8

这个答案通过使用数据的行数创建一个变量序列,并在每4行循环,计算pred_sales,更新要在下一个循环迭代中使用的pred值。 / p>