2013-06-03 44 views
5

Tôi thường xử lý dữ liệu ở định dạng xts và thường phải chia tỷ lệ cho chúng (giả sử bằng 100 vào một số ngày). Tôi hiện đang làm điều này bằng cách sử dụng một chức năng, hoạt động bằng cách sử dụng một for-loop - tuy nhiên điều này không có vẻ rất chức năng.cột tỷ lệ của đối tượng xts

Dưới đây là làm thế nào tôi làm điều đó bây giờ:

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

Có một số thông minh apply loại chức năng đó là R cách để làm điều này?

Trả lời

4

sweep có thể được sử dụng để chia ma trận theo hàng.

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

+1, tuyệt vời - cảm ơn. – ricardo

+0

Tuyệt. Tôi cho rằng 'sweep' sẽ không hoạt động nếu không sử dụng' coredata (dfx [1]) 'nhưng lời gọi nội bộ tới' mảng' sẽ xử lý điều đó cho bạn. –

3

Bạn có thể sử dụng apply.daily. Lưu ý rằng bạn vẫn phải sử dụng coredata trên hàng bạn muốn chia bởi vì hoạt động xts/zoo luôn được căn chỉnh theo chỉ mục trước khi thực hiện thao tác.

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

+1, cảm ơn. vì vậy nếu đây là dữ liệu hàng tháng, tôi sẽ sử dụng apply.monthly? – ricardo

+0

@ricardo: Trong ví dụ của bạn, 'dfx' * là * hàng tháng và' apply.daily' đã hoạt động. Nó hoạt động vì chỉ mục cho 'dfx' là Date. –

+0

tôi cầu xin sự tha thứ của bạn - tôi đã không thử trước khi tôi hỏi. Tôi suy ra từ điều này mà 'apply.daily' sẽ làm việc trong mọi trường hợp sau đó? – ricardo

Các vấn đề liên quan