首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >季度增长计算(R)

季度增长计算(R)
EN

Stack Overflow用户
提问于 2016-11-28 21:52:21
回答 5查看 277关注 0票数 3

我有不同业务部门的季度计划收入价值。我有以下数据集:

代码语言:javascript
复制
segment  Q1_Revenue  Q2_Revenue  Q3_Revenue  Q4_Revenue

 A             1002         100         279         787          

 B              985         300         658         456

 C              478         745         5478        100  

或者:

代码语言:javascript
复制
revenues <- data.frame(segment = c('A','B','C'),
           Q1_Revenue = c(1002,985,478),
           Q2_Revenue = c(100,300,745),
           Q3_Revenue = c(279,658,5478),
           Q4_Revenue = c(787, 456, 100),
           stringsAsFactors = F)

我想用循环来计算季度到季度的增长,这样它才会是动态的。我可以通过使用SQL来做到这一点。但我想使用循环对列,以便我可以得到所有季度明智的增长.e.g:

  • Q4到Q1增长,Q4到Q2增长,Q4到Q3增长;
  • Q3 to Q2 growth,Q3 to Q1 growth,Q2 to Q1 growth。

任何线索都将不胜感激。

谢谢

EN

回答 5

Stack Overflow用户

发布于 2016-11-28 22:15:52

这里有一条路。它假定列的顺序是正确的,以便开始。

代码语言:javascript
复制
growth = list()
for (base_q in 2:ncol(revenues)) {
    for (growth_q in 2:base_q) {
        if (base_q == growth_q) next
        name = paste(names(revenues)[base_q], "to", names(revenues)[growth_q], sep = "_")
        growth[[name]] = revenues[[base_q]] / revenues[[growth_q]]
    }   
}
data.frame(segment = revenues[[1]], growth)
#   segment Q2_Revenue_to_Q1_Revenue Q3_Revenue_to_Q1_Revenue Q3_Revenue_to_Q2_Revenue Q4_Revenue_to_Q1_Revenue Q4_Revenue_to_Q2_Revenue
# 1       A                0.0998004                0.2784431                 2.790000                0.7854291                7.8700000
# 2       B                0.3045685                0.6680203                 2.193333                0.4629442                1.5200000
# 3       C                1.5585774               11.4602510                 7.353020                0.2092050                0.1342282
#   Q4_Revenue_to_Q3_Revenue
# 1               2.82078853
# 2               0.69300912
# 3               0.01825484
票数 1
EN

Stack Overflow用户

发布于 2016-11-28 22:16:32

这个问题并没有具体说明输出应该是什么样子,但是这里有一些替代方案和方法。不使用包装。

在(1)中的三维数组是特别方便的,如果我们想要切片,例如只看一个片段或四分之一,也可以很容易地被改造成一个2d的ftable,如图所示。

(2)中的输出矩阵更紧凑,可以以原始或转置格式显示。

1)外部尝试将outer应用于每一行。我们生成一个列表( A、B和C中的每一个元素),并将其简化为一个3d数组,我们将其与一些替代的ftable显示一起显示。

例如,对于A,我们有Q4/Q1 =787/1002-1= -0.2145709,这是在分子Q4和分母Q1处发现的A中的数字。

代码语言:javascript
复制
growthMat <- function(x) {
   mat <- matrix(outer(tail(x, -1), head(x, -1), "/") - 1, length(x)-1)
   mat[row(mat) < col(mat)] <- NA
   dimnames(mat) <- list(Num = tail(names(x), -1), Den = head(names(x), -1))
   list(mat)
}

L <- setNames(apply(revenues[-1], 1, growthMat), revenues[[1]])
arr <- simplify2array(lapply(L, "[[", 1))

给出这个三维数组:

代码语言:javascript
复制
> arr
, ,  = A

                Den
    Num          Q1_Revenue Q2_Revenue Q3_Revenue
      Q2_Revenue -0.9001996         NA         NA
      Q3_Revenue -0.7215569       1.79         NA
      Q4_Revenue -0.2145709       6.87   1.820789

    , ,  = B

                Den
    Num          Q1_Revenue Q2_Revenue Q3_Revenue
      Q2_Revenue -0.6954315         NA         NA
      Q3_Revenue -0.3319797   1.193333         NA
      Q4_Revenue -0.5370558   0.520000 -0.3069909

    , ,  = C

                Den
    Num          Q1_Revenue Q2_Revenue Q3_Revenue
      Q2_Revenue  0.5585774         NA         NA
      Q3_Revenue 10.4602510  6.3530201         NA
      Q4_Revenue -0.7907950 -0.8657718 -0.9817452

或者作为一个2d "ftable"对象:

代码语言:javascript
复制
> ftable(arr)
                                A          B          C
Num        Den                                         
Q2_Revenue Q1_Revenue  -0.9001996 -0.6954315  0.5585774
           Q2_Revenue          NA         NA         NA
           Q3_Revenue          NA         NA         NA
Q3_Revenue Q1_Revenue  -0.7215569 -0.3319797 10.4602510
           Q2_Revenue   1.7900000  1.1933333  6.3530201
           Q3_Revenue          NA         NA         NA
Q4_Revenue Q1_Revenue  -0.2145709 -0.5370558 -0.7907950
           Q2_Revenue   6.8700000  0.5200000 -0.8657718
           Q3_Revenue   1.8207885 -0.3069909 -0.9817452

或者这个:

代码语言:javascript
复制
> ftable(arr, row.vars = 3)
  Num Q2_Revenue                       Q3_Revenue                       Q4_Revenue                      
  Den Q1_Revenue Q2_Revenue Q3_Revenue Q1_Revenue Q2_Revenue Q3_Revenue Q1_Revenue Q2_Revenue Q3_Revenue

A     -0.9001996         NA         NA -0.7215569  1.7900000         NA -0.2145709  6.8700000  1.8207885
B     -0.6954315         NA         NA -0.3319797  1.1933333         NA -0.5370558  0.5200000 -0.3069909
C      0.5585774         NA         NA 10.4602510  6.3530201         NA -0.7907950 -0.8657718 -0.9817452

( 2)梳理前两行计算增长率,给出mat,然后最后两行添加行名和列名

代码语言:javascript
复制
growth <- function(nms) revenues[[nms[2]]]/revenues[[nms[1]]] - 1
mat <- combn(names(revenues[-1]), 2, growth)
pasteNames <- function(nms) paste(rev(nms), collapse = ":")
dimnames(mat) <- list(revenues[[1]], combn(names(revenues[-1]), 2, pasteNames))

给出这个3x6矩阵:

代码语言:javascript
复制
> mat
  Q2_Revenue:Q1_Revenue Q3_Revenue:Q1_Revenue Q4_Revenue:Q1_Revenue
A            -0.9001996            -0.7215569            -0.2145709
B            -0.6954315            -0.3319797            -0.5370558
C             0.5585774            10.4602510            -0.7907950
  Q3_Revenue:Q2_Revenue Q4_Revenue:Q2_Revenue Q4_Revenue:Q3_Revenue
A              1.790000             6.8700000             1.8207885
B              1.193333             0.5200000            -0.3069909
C              6.353020            -0.8657718            -0.9817452

或转置:

代码语言:javascript
复制
> t(mat)
                               A          B          C
Q2_Revenue:Q1_Revenue -0.9001996 -0.6954315  0.5585774
Q3_Revenue:Q1_Revenue -0.7215569 -0.3319797 10.4602510
Q4_Revenue:Q1_Revenue -0.2145709 -0.5370558 -0.7907950
Q3_Revenue:Q2_Revenue  1.7900000  1.1933333  6.3530201
Q4_Revenue:Q2_Revenue  6.8700000  0.5200000 -0.8657718
Q4_Revenue:Q3_Revenue  1.8207885 -0.3069909 -0.9817452

更新: (1)中的几个改进和替代输出。另加(2)。

票数 1
EN

Stack Overflow用户

发布于 2016-11-28 23:10:51

试试这个-(修改)

代码语言:javascript
复制
growth <- sapply(seq(1:3), function(x) 
           {
            data.frame((revenues[,paste0("Q",seq(4, x + 1, -1),"_Revenue")] -
                        revenues[,paste0("Q",x,"_Revenue")]) / 
                        revenues[,paste0("Q",seq(4, x + 1, -1),"_Revenue")])
           })
growth <- cbind(growth[[1]], growth[[2]], growth[[3]])
names(growth) <- sapply(seq(1:3), function(x) paste0("Q",seq(4,x+1,-1)," over Q",x))
rownames(growth) <- c("A", "B", "C")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40854182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档