2013-06-03 1 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