0

複数のブランドと年にわたる収益データを列に持つデータセットがあります。各列名には、09-12 の Brandname.yr があります。一部のブランドでは、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
          ]

}
4

1 に答える 1

0

CAGR を計算するときは、最初のケースのように、括弧を追加する必要があります。

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() では注意が必要です。正規表現では、ドット.は任意の文字に一致します。\.文字通りドットに一致するように記述する必要があります。具体的なケースでは問題ありませんが、注意してください。

また、データを長い形式で再編成することを検討し、場合によっては CAGR を計算する関数を定義することをお勧めします (別の月に同じ計算をスペルアウトする際の技術的な間違いを避けるため.

于 2013-10-02T08:53:33.920 に答える