2013-06-03 13 views
5

私は多くの場合、xtsフォーマットのデータを扱いますが、しばしばそれらをスケールする必要があります(ある日付では100に等しいと言います)。私は現在、for-loopを使用して動作する関数を使用してこれを行いますが、これは非常にの機能のようには見えません。ここでxtsオブジェクトのスケールカラム

は、私は今それを行う方法は次のとおりです。

df1 <- data.frame(rnorm(100), runif(100), 1:100*rnorm(100)) 
dfx <- xts(df1, order.by = seq(as.Date("2001-01-01"), by='mon', length.out=100)) 

dfxColScl <- function(dfrm, pos=1, idx = 100) 
{ 
    scaledDF <- dfrm 
    for (i in 1:ncol(dfrm)) { 
     scaledDF[, i] <- dfrm[,i]/as.numeric(dfrm[pos, i]) * idx 
    } 
    return(scaledDF) 
} 

これを行うにはR方法ですいくつかの巧妙なapplyタイプの機能はありますか?

答えて

4

sweepは、行列を行で分割するために使用できます。

dfx.scaled2 <- sweep(100*dfx, 2, dfx[1], "/") 
all.equal(dfx.scaled, dfx.scaled2) # same result as @Joshua 
#[1] TRUE 
+0

+1、クール - ありがとう。 – ricardo

+0

ニース。私は 'sweep'が' coredata(dfx [1]) 'を使わなければ動作しないと仮定しましたが、 'array'への内部呼び出しがあなたのために処理します。 –

3

apply.dailyを使用できます。 xts/zoo操作は、操作を実行する前にインデックスで常に整列されるため、分割する行ではまだcoredataを使用する必要があることに注意してください。

dfx.scaled <- apply.daily(dfx, function(x) x/coredata(dfx[1,])*100) 
+0

+1、ありがとう。これが毎月のデータだったら、apply.monthlyを使用しますか? – ricardo

+0

@ricardo:あなたの例では、 'dfx' *が毎月行われ、' apply.daily'が働いていました。 'dfx'のインデックスがDateであるために動作します。 –

+0

私はあなたの許しを請う - 私は尋ねる前に私はそれを試していない。私はこのことから、 'apply.daily'がすべてのケースで動作すると推測していますか? – ricardo

関連する問題