1

データフレームの列のサブセットの各列の値に基づいて、複数の新しい列を計算してデータフレームに追加する必要があります。これらの列はすべて時系列データを保持します(共通の日付列があります)。たとえば、前年の同じ月の12列の変化を計算する必要があります。それらを指定して個別に計算することもできますが、変換する列の数が多いと面倒になるため、forループを使用してプロセスを自動化しようとしています。

ddplyこれまでの年の値の現在の合計の列を作成するために使用しようとするまで、私はOKを実行していました。何が起こるかというとddply、ループの各反復中に新しい行を追加し、それらの新しい行をcumsum計算に含めます。2つの質問があります。

Q.正しいcumsumを計算するためにddplyを取得するにはどうすればよいですか?Q.ダミー値を使用して後で名前を変更するのではなく、ddply呼び出し中に列の名前を指定するにはどうすればよいですか?

[編集:話が早すぎたので、以下の更新されたコードは現時点では機能しません。参考までに]

require(lubridate)
require(plyr)
require(xts)

set.seed(12345)
# create dummy time series data
monthsback <- 24
startdate <- as.Date(paste(year(now()),month(now()),"1",sep = "-")) - months(monthsback)
mydf <- data.frame(mydate = seq(as.Date(startdate), by = "month", length.out = monthsback),
                   myvalue1 = runif(monthsback, min = 600, max = 800),
                   myvalue2 = runif(monthsback, min = 200, max = 300))

mydf$year <- as.numeric(format(as.Date(mydf$mydate), format="%Y"))
mydf$month <- as.numeric(format(as.Date(mydf$mydate), format="%m"))
newcolnames <- c('myvalue1','myvalue2')

for (i in seq_along(newcolnames)) {
    print(newcolnames[i])
    mydf$myxts <- xts(mydf[, newcolnames[i]], order.by = mydf$mydate)
    ## Calculate change over same month in previous year
    mylag <- 12
    mydf[, paste(newcolnames[i], "_yoy", sep = "", collapse = "")] <- as.numeric(diff(mydf$myxts, lag = mylag)/ lag(mydf$myxts, mylag))
    ## Calculate change over previous month
    mylag <- 1
    mydf[, paste(newcolnames[i], "_mom", sep = "", collapse = "")] <- as.numeric(diff(mydf$myxts, lag = mylag)/ lag(mydf$myxts, mylag))

    ## Calculate cumulative figure
    #mydf$newcol <- as.numeric(mydf$myxts)
    mydf$newcol <- 1
    mydf <- ddply(mydf, .(year), transform, newcol = cumsum(as.numeric(mydf$myxts)))
    colnames(mydf)[colnames(mydf)=="newcol"] <- paste(newcolnames[i], "_cuml", sep = "", collapse = "")

}

mydf
4

1 に答える 1

0

ループでmyxtsは、はデータフレームの一部ではないため、他のddplyすべてと一緒にステートメントで分割されることはありません。次のように変更します。

mydf$myxts <- xts(mydf[, newcolnames[i]], order.by = mydf$mydate)

動的に生成された名前を。で使用する方法がわかりませんtransform

于 2012-05-09T16:00:52.020 に答える