Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 缩放xts对象的列_R_For Loop_Xts_Apply - Fatal编程技术网

R 缩放xts对象的列

R 缩放xts对象的列,r,for-loop,xts,apply,R,For Loop,Xts,Apply,我经常以xts格式处理数据,并且经常必须对它们进行缩放(比如在某个日期等于100)。目前,我使用一个函数来实现这一点,该函数使用for循环——但是这似乎不是很实用 我现在是这样做的: 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

我经常以
xts
格式处理数据,并且经常必须对它们进行缩放(比如在某个日期等于100)。目前,我使用一个函数来实现这一点,该函数使用
for循环
——但是这似乎不是很实用

我现在是这样做的:

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

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

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

dfx.scaled
sweep
可用于将矩阵除以一行

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

dfx.scaled2+1,谢谢。所以如果这是月度数据,我会使用apply.monthly?@ricardo:在你的例子中,
dfx
是月度数据,而
apply.daily
有效。它之所以有效,是因为
dfx
的索引是Date。请原谅,我问之前没有试过。我由此推断,
apply.daily
在所有情况下都有效吗?@ricardo:如果对象的索引是
Date
对象,则在所有情况下都有效。当索引为
yearmon
yearqtr
时,它可能会起作用,但我不确定。如果索引每天有多个观察值,那么它肯定不起作用,因为
apply.daily
会将它们聚合为每天一个观察值。很好。我假设如果不使用
coredata(dfx[1])
的话,
sweep
将无法工作,但是对
array
的内部调用会为您解决这个问题。