Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 季度同比变化_R_Function_Dataframe_Loops - Fatal编程技术网

R 季度同比变化

R 季度同比变化,r,function,dataframe,loops,R,Function,Dataframe,Loops,我有一个季度时间序列。我试图应用一个函数,它应该计算年与年的增长和年与年的差异,并将一个变量乘以(-1) 我已经使用了一个类似的函数来计算季度间的变化,它起了作用。 我修改了此函数以实现同比变化,它对我的数据帧没有任何影响。任何错误都会出现 您对如何修改该函数或如何实现在时间序列上应用年变化函数有何建议 代码如下: Date <- c("2004-01-01","2004-04-01", "2004-07-01","20

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

我已经使用了一个类似的函数来计算季度间的变化,它起了作用。 我修改了此函数以实现同比变化,它对我的数据帧没有任何影响。任何错误都会出现

您对如何修改该函数或如何实现在时间序列上应用年变化函数有何建议

代码如下:

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)
我想对变量应用以下更改:

# 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)  
}

按月份分组,即第6和第7次
substr
ing使用
ave
并进行必要的计算。使用
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

f按月份分组,即第6次和第7次
substr
ing使用
ave
并进行必要的计算。使用
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

f您能否说明
df
在转换后会如何处理,即您的预期输出?您能否用您预期进行的实际数学计算来编辑您的问题?还有,正如jay.sf所写的,以及您期望的输出的示例。当然,我添加了我的期望输出。您能说明
df
如何处理转换后的输出,即您的期望输出吗?您能用您期望进行的实际数学计算编辑您的问题吗?正如jay.sf所写的,还有您期望的输出示例。当然,我添加了我期望的输出。
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