2016-05-06 5 views
0

Irgendeine Idee, warum das so langsam ist?Sehr langsam: xts Spalte durch erste Zeile teilen

Ich versuche, eine Matrix zu seiner ersten Zeile zu indizieren.

> nrow(cfm2) 
[1] 8326 
> head(cfm2) 
       TSX  TY1 GC1:CAD CL1:CAD 
1983-12-01 2558.0 80.43750 497.3676 36.29842 
1983-12-02 2550.2 79.84375 496.1024 36.55753 
1983-12-05 2540.2 79.81250 496.9146 36.49022 
1983-12-06 2536.8 79.84375 495.9524 36.41626 
1983-12-07 2549.3 79.68750 501.9910 36.16226 
1983-12-08 2535.5 79.25000 484.1805 36.44115 

Ich versuchte dies, bekam seltsame Ergebnisse:

> cfm <- cfm2/drop(coredata(cfm2[1])) 
> head(cfm) 
        TSX  TY1 GC1:CAD CL1:CAD 
1983-12-01 1.0000000 0.16172644 0.1944361 0.07298106 
1983-12-02 31.7041175 2.19964833 6.1675513 1.00713855 
1983-12-05 5.1072883 0.03120113 0.9990891 0.01426514 
1983-12-06 69.8873485 0.99261849 13.6631959 0.45272736 
1983-12-07 0.9965989 0.16021851 0.1962435 0.07270731 
1983-12-08 31.5213675 2.18329086 6.0193380 1.00393224 

ich das versucht, bekam die richtigen Ergebnisse, aber es dauerte ewig.

test.cfm <- function(cfm){ 
    cfm1 <- cfm 
    for(cc in 1:ncol(cfm)){ 
    for(rr in 1:nrow(cfm)){ 
     coredata(cfm[rr,cc]) <- 100 * coredata(cfm1[rr,cc])/coredata(cfm1[1,cc]) 
    } 
    } 
    return(cfm) 
} 

> system.time(cfm <- test.cfm(cfm2)) 
    user system elapsed 
17.809 4.886 22.896 
> head(cfm) 
       TSX  TY1 GC1:CAD CL1:CAD 
1983-12-01 100.00000 100.00000 100.00000 100.00000 
1983-12-02 99.69507 99.26185 99.74561 100.71385 
1983-12-05 99.30414 99.22300 99.90891 100.52841 
1983-12-06 99.17123 99.26185 99.71545 100.32465 
1983-12-07 99.65989 99.06760 100.92956 99.62491 
1983-12-08 99.12041 98.52370 97.34861 100.39322 

Irgendeine Idee was ist los? Ich bin sicher, dass dies für diejenigen mit Erfahrung offensichtlich sein muss, aber ich bin perplex ...

Antwort

3

Ihre Schleife ist über jeden. Single. Element. Lassen Sie Rs Vektorisierung Ihnen helfen.

test.cfm.new <- function(cfm) { 
    for(cc in 1:ncol(cfm)) { 
     cfm[,cc] <- cfm[,cc]/drop(coredata(cfm[1,cc])) 
    } 
    return(100 * cfm) 
} 
require(xts) 
data(sample_matrix) 
x <- as.xts(sample_matrix) 
system.time(cfm <- test.cfm(x)) 
# user system elapsed 
# 0.111 0.000 0.112 
system.time(cfm.new <- test.cfm.new(x)) 
# user system elapsed 
# 0.000 0.000 0.001 
all.equal(cfm, cfm.new) 
# [1] TRUE 
+0

Fantastisch! Vielen Dank!! Ich hatte die for Schleife für Zeile, nicht für Spalte versucht. Irgendeine Idee warum man arbeitet und nicht die andere? –

+0

@DeepakRamachandran: Sie müssen etwas anderes falsch gemacht haben, als Sie die Schleife für Zeile ausprobiert haben, weil es auch funktioniert: 'für (rr in 1: nw (cfm)) cfm [rr,] <- cfm [rr,]/drop (coredata (cfm [1,])) ' –