【问题标题】:sales calculation as per the below method按以下方法计算销售额
【发布时间】:2018-09-21 08:07:04
【问题描述】:

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

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

前 4 个季度是北美。保持原样。 从第 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.

请帮我做这个添加。

我只能做第一年的加法。

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

谢谢。

【问题讨论】:

    标签: r loops dataframe


    【解决方案1】:

    更新问题

    使用更新的问题,以下是完成任务的一种方法。由于这是季度数据,前四行是 NA,您可以先将mydf1 中的cut_off 的值添加到Sales。然后,您创建一个分组变量。 1 表示第一季度。您可以将Salescumsum() 相加,正如我在之前的回答中所建议的那样。看来您想保留 NA。所以我最后将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 的情况。首先,我在mydf1 中添加了cut_off 的值。然后,我创建了一个名为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))
    

    【讨论】:

    • 如果我只有 sales 列和 cutoff_sales ..... 你能帮我解决这个问题吗?
    • @bradonMc 你能编辑你的问题吗?最好把你的真实情况说清楚。
    • @bradonMc 我为更新的问题添加了新代码。
    • 是否有 na_if 的替代语句,因为我使用的企业 R 不支持 na_if。
    • @bradonMc 为什么不使用replace()ifelse()
    【解决方案2】:

    新的顺序答案:

    > 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 值以在下一次循环迭代中使用。

    【讨论】:

    • 如果我以后没有年和季列怎么办,只有销售和截止 Df
    • 你也可以按顺序做,我加个解决办法。
    • 感谢 LAP 的所有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2019-10-09
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多