我有不同业务部门的季度计划收入价值。我有以下数据集:
segment Q1_Revenue Q2_Revenue Q3_Revenue Q4_Revenue
A 1002 100 279 787
B 985 300 658 456
C 478 745 5478 100 或者:
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:
任何线索都将不胜感激。
谢谢
发布于 2016-11-28 22:15:52
这里有一条路。它假定列的顺序是正确的,以便开始。
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发布于 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中的数字。
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))给出这个三维数组:
> 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"对象:
> 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或者这个:
> 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,然后最后两行添加行名和列名
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矩阵:
> 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或转置:
> 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)。
发布于 2016-11-28 23:10:51
试试这个-(修改)
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")https://stackoverflow.com/questions/40854182
复制相似问题