【问题标题】:Quarterly year-to-year changes季度同比变化
【发布时间】:2020-12-23 12:38:29
【问题描述】:

我有一个季度时间序列。我正在尝试应用一个函数,该函数应该计算逐年增长和逐年差异,并将变量乘以 (-1)。

我已经使用了一个类似的函数来计算季度间的变化,并且它很有效。 我针对 yoy 的变化修改了这个函数,它对我的​​数据框没有任何影响。并弹出任何错误。

您对如何修改函数或如何完成将 yoy change 函数应用于时间序列有任何建议吗?

代码如下:

Date <- c("2004-01-01","2004-04-01", "2004-07-01","2004-10-01","2005-01-01","2005-04-01","2005-07-01","2005-10-01","2006-01-01","2006-04-01","2006-07-01","2006-10-01","2007-01-01","2007-04-01","2007-07-01","2007-10-01")
B1 <- c(3189.30,3482.05,3792.03,4128.66,4443.62,4876.54,5393.01,5885.01,6360.00,6930.00,7430.00,7901.00,8279.00,8867.00,9439.00,10101.00)
B2 <- c(7939.97,7950.58,7834.06,7746.23,7760.59,8209.00,8583.05,8930.74,9424.00,9992.00,10041.00,10900.00,11149.00,12022.00,12662.00,13470.00)
B3 <- as.numeric(c("","","","",140.20,140.30,147.30,151.20,159.60,165.60,173.20,177.30,185.30,199.30,217.10,234.90))
B4 <- as.numeric(c("","","","",-3.50,-14.60,-11.60,-10.20,-3.10,-16.00,-4.90,-17.60,-5.30,-10.90,-12.80,-8.40))
df <- data.frame(Date,B1,B2,B3,B4)

代码会产生如下数据框:

Date       B1       B2    B3    B4
1  2004-01-01  3189.30  7939.97    NA    NA
2  2004-04-01  3482.05  7950.58    NA    NA
3  2004-07-01  3792.03  7834.06    NA    NA
4  2004-10-01  4128.66  7746.23    NA    NA
5  2005-01-01  4443.62  7760.59 140.2  -3.5
6  2005-04-01  4876.54  8209.00 140.3 -14.6
7  2005-07-01  5393.01  8583.05 147.3 -11.6
8  2005-10-01  5885.01  8930.74 151.2 -10.2
9  2006-01-01  6360.00  9424.00 159.6  -3.1
10 2006-04-01  6930.00  9992.00 165.6 -16.0
11 2006-07-01  7430.00 10041.00 173.2  -4.9
12 2006-10-01  7901.00 10900.00 177.3 -17.6
13 2007-01-01  8279.00 11149.00 185.3  -5.3
14 2007-04-01  8867.00 12022.00 199.3 -10.9
15 2007-07-01  9439.00 12662.00 217.1 -12.8
16 2007-10-01 10101.00 13470.00 234.9  -8.4

我想对变量应用以下更改:

# yoy absolute difference change 
abs.diff = c("B1","B2")
# yoy percentage change
percent.change = c("B3")
# make the variable negative
negative = c("B4")

这是我试图用于我的数据框的功能。

transformation = function(D,abs.diff,percent.change,negative) 
{  
  TT <- dim(D)[1]
  DData <- D[-1,]
  nms <- c()
  for (i in c(2:dim(D)[2])) { 
    # yoy absolute difference change
    if (names(D)[i] %in% abs.diff) 
    {    DData[,i] = (D[5:TT,i]-D[1:(TT-4),i])
    names(DData)[i] = paste('a',names(D)[i],sep='') }   
    
    # yoy  percent. change
    if (names(D)[i] %in% percent.change) 
    { DData[,i] = 100*(D[5:TT,i]-D[1:(TT-4),i])/D[1:(TT-4),i]
    names(DData)[i] = paste('p',names(D)[i],sep='') }
    
    #CA.deficit
    if (names(D)[i] %in% negative) 
    { DData[,i] = (-1)*D[1:TT,i] }
    
  }
  return(DData)  
}

这是我想要的:

      Date   pB1   pB2  aB3   B4
1  2004-01-01    NA    NA   NA   NA
2  2004-04-01    NA    NA   NA   NA
3  2004-07-01    NA    NA   NA   NA
4  2004-10-01    NA    NA   NA   NA
5  2005-01-01 39.33 -2.26   NA  3.5
6  2005-04-01 40.05  3.25   NA 14.6
7  2005-07-01 42.22  9.56   NA 11.6
8  2005-10-01 42.54 15.29 11.0 10.2
9  2006-01-01 43.13 21.43 19.3  3.1
10 2006-04-01 42.11 21.72 18.3 16.0
11 2006-07-01 37.77 16.99 22.0  4.9
12 2006-10-01 34.26 22.05 17.7 17.6
13 2007-01-01 30.17  18.3 19.7  5.3
14 2007-04-01 27.95 20.32 26.1 10.9
15 2007-07-01 27.04  26.1 39.8 12.8
16 2007-10-01 27.84 23.58 49.6  8.4

【问题讨论】:

  • 您能否展示df 将如何处理转换,即您的预期输出?
  • 您能用您期望进行的实际数学计算来编辑您的问题吗?而且,正如 jay.sf 所写,以及您期望的输出示例。
  • 当然,我添加了预期的输出。

标签: r function dataframe loops


【解决方案1】:

使用 ave 按月份分组,即第 6 和第 7 substring 并进行必要的计算。使用sapply,我们可以遍历列。

f <- function(x) {
  g <- substr(Date, 6, 7)
  l <- length(unique(g))
  o <- ave(x, g, FUN=function(x) 100/x * c(x[-1], NA) - 100)
  c(rep(NA, l), head(o, -4))
}

cbind(df[1], sapply(df[-1], f))
#          Date       B1        B2       B3         B4
# 1  2004-01-01       NA        NA       NA         NA
# 2  2004-04-01       NA        NA       NA         NA
# 3  2004-07-01       NA        NA       NA         NA
# 4  2004-10-01       NA        NA       NA         NA
# 5  2005-01-01 39.32901 -2.259202       NA         NA
# 6  2005-04-01 40.04796  3.250329       NA         NA
# 7  2005-07-01 42.21960  9.560688       NA         NA
# 8  2005-10-01 42.54044 15.291439       NA         NA
# 9  2006-01-01 43.12655 21.434066 13.83738 -11.428571
# 10 2006-04-01 42.10895 21.720063 18.03279   9.589041
# 11 2006-07-01 37.77093 16.986386 17.58316 -57.758621
# 12 2006-10-01 34.25636 22.050356 17.26190  72.549020
# 13 2007-01-01 30.17296 18.304329 16.10276  70.967742
# 14 2007-04-01 27.95094 20.316253 20.35024 -31.875000
# 15 2007-07-01 27.03903 26.102978 25.34642 161.224490
# 16 2007-10-01 27.84458 23.577982 32.48731 -52.272727

【讨论】:

    猜你喜欢
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    相关资源
    最近更新 更多