基于R中列标题的CAGR自动计算

基于R中列标题的CAGR自动计算,r,function,loops,data.table,R,Function,Loops,Data.table,我有一个数据集,其中列有多个品牌和年份的收入数据。每个列名都有Brandname.yr,用于09-12。一些品牌只有10-12或11-12的数据。我开发了以下代码来计算每个品牌中每个客户的CAGR。然而,当我执行代码时,我的CAGR为数千(即4800.74)。有人对CAGR计算没有正确执行有什么建议吗 数据示例 ClientID Rv.Brand1.09 Rv.Brand1.10 Rv.Brand1.11 Rv.Brand1.12 Rv.Brand2.09 R

我有一个数据集,其中列有多个品牌和年份的收入数据。每个列名都有Brandname.yr,用于09-12。一些品牌只有10-12或11-12的数据。我开发了以下代码来计算每个品牌中每个客户的CAGR。然而,当我执行代码时,我的CAGR为数千(即4800.74)。有人对CAGR计算没有正确执行有什么建议吗

数据示例

ClientID    Rv.Brand1.09    Rv.Brand1.10    Rv.Brand1.11    Rv.Brand1.12    Rv.Brand2.09    Rv.Brand2.10    Rv.Brand2.11    Rv.Brand2.12
1   6991979 6931508 5071305 4944208 2079843 2990803 2111142 1977724
2   0   0   0   0   0   0   0   0
3   0   29425   0   0   0   29425   0   0
4   0   0   0   0   0   0   0   0
5   0   0   0   0   0   0   0   0




library(data.table)
dataset <- data.table(mdb)
# Getting the list of column names for which CAGR needs to be calculated
Instance09 = gsub(
  colnames(dataset)[
    grepl(colnames(dataset), pattern = ".09")
    ], 
  pattern = ".09", 
  replacement = ""
)

Instance10 = gsub(
  colnames(dataset)[
    grepl(colnames(dataset), pattern = ".10")
    ], 
  pattern = ".10", 
  replacement = ""
)

Instance11 = gsub(
  colnames(dataset)[
    grepl(colnames(dataset), pattern = ".11")
    ], 
  pattern = ".11", 
  replacement = ""
)

Instance12 = gsub(
  colnames(dataset)[
    grepl(colnames(dataset), pattern = ".12")
    ], 
  pattern = ".12", 
  replacement = ""
)

Instance0912 <- intersect(Instance09,Instance12)

Instance1012 <- intersect(Instance10,Instance12)

Instance1112 <- intersect(Instance11,Instance12)

Instance1012 <- Instance1012[!Instance1012 %in% Instance0912]

Instance1112 <- Instance1112[!Instance1112 %in% Instance0912]

for ( i in Instance0912 )
{
  #calculating CAGR for each i
  #dataset is a data.table and not a data.frame
  dataset[, 
          paste0("CAGR",i):= (get(paste0(i,".12")) / get(paste0(i,".09")) ^ (1/3)) - 1
          ]

}

for ( i in Instance1012 )
{
  #calculating CAGR for each i
  #dataset is a data.table and not a data.frame
  dataset[, 
          paste0("CAGR",i):= (get(paste0(i,".12")) / get(paste0(i,".10")) ^ (1/2)) - 1
          ]

}

for ( i in Instance1112 )
{
  #calculating CAGR for each i
  #dataset is a data.table and not a data.frame
  dataset[, 
          paste0("CAGR",i):= (get(paste0(i,".12")) / get(paste0(i,".11")) ^ 1) - 1
          ]

}
ClientID Rv.Brand1.09 Rv.Brand1.10 Rv.Brand1.11 Rv.Brand1.12 Rv.Brand2.09 Rv.Brand2.10 Rv.Brand2.11 Rv.Brand2.12
1   6991979 6931508 5071305 4944208 2079843 2990803 2111142 1977724
2   0   0   0   0   0   0   0   0
3   0   29425   0   0   0   29425   0   0
4   0   0   0   0   0   0   0   0
5   0   0   0   0   0   0   0   0
库(数据表)

dataset计算复合年增长率时,需要加上一组括号,第一种情况如下:

for ( i in Instance0912 )
{
#calculating CAGR for each i
#dataset is a data.table and not a data.frame
dataset[, 
        paste0("CAGR",i) := ((get(paste0(i,".12")) / get(paste0(i,".09"))) ^ (1/3)) - 1
        ]

}
在grepl()中,在正则表达式中,点
匹配任何字符时都要小心。你需要把它写成
\。
来匹配一个点。这在具体案例中不是问题,只是要意识到这一点

我还建议您考虑以长格式重新组织数据,并可能定义一个函数来计算复合年增长率(为了避免在不同月份拼写相同的计算时出现技术错误。

这是一个最小的例子吗;例如,这里的所有代码是否真的有必要证明您的问题?哪一行代码生成4800.74;即,您是否可以包含输出?