缩放xts对象的列

时间:2013-06-03 19:21:35

标签: r for-loop xts apply

我经常以xts格式处理数据,并且经常必须缩放它们(比如在某个日期等于100)。我现在使用一个使用for-loop工作的函数来执行此操作 - 但这似乎不是功能

以下是我现在的表现:

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

是否有一些聪明的apply类型函数是R方法吗?

2 个答案:

答案 0 :(得分:4)

sweep可用于将矩阵除以一行。

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

答案 1 :(得分:3)

您可以使用apply.daily。请注意,您仍然必须在要除以的行上使用coredata,因为在执行操作之前,xts / zoo操作始终按索引对齐。

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