2016-04-03 1 views
0

Ich versuche, eine Schleife zu schreiben, die durch meinen Vektor der Doppelgänger durchlaufen wird, und berechnen Sie die Standardabweichung jeder Gruppe von 5 Werten. Unten ist der Code, den ich geschrieben habe, um dies zu tun, aber wenn ich versuche, es auszuführen, gibt es die Mehrheit meiner NA als ein Wert, der nicht genau ist.Iterieren durch einen Vektor, Berechnung der Standardabweichung von jeder n Anzahl von Werten in R

Daten sind große Matrix mit 53412 Elementen, sollte ca. 1175 Zeilen sein.

for(i in floor((nrow(data)/5)-5)){sd5[i] <-sd(data[seq((5*i) + 1,(5*i) + 5),6])} 

Ich habe versucht, manuell durch sie itterate, nur die Ausführung der folgenden in der Konsole

sd(data[seq((5) + 1,(5*i) + 5),6]) 
sd(data[seq((10) + 1,(10) + 5),6]) 
sd(data[seq((15) + 1,(15) + 5),6]) 

Jede dieser einwandfrei funktionieren, aber wenn ich es mit der Schleife zu tun, versucht es, ergibt NA für den Großteil meiner Daten, einschließlich der 2. und 3. Zeile im obigen Codeblock.

Hier ein paar Zeilen aus der CSV ist es

2016-04-01,108.779999,110.00,108.199997,109.989998,25626200,109.989998 
2016-03-31,109.720001,109.900002,108.879997,108.989998,25685700,108.989998 
2016-03-30,108.650002,110.419998,108.599998,109.559998,45159900,109.559998 
2016-03-29,104.889999,107.790001,104.879997,107.68,30774100,107.68 
2016-03-28,106.00,106.190002,105.059998,105.190002,19303600,105.190002 

Nur für den Fall zu lesen, wollte ich, dass ich die richtigen Werte bin Grabbing aus der CSV-Datei, darauf hinzuweisen, atleast, wenn ich sd manuell ausführen (), da ich die Konsolenausgabe mit der CSV-Datei verglichen habe. Das bedeutet jedoch nicht, dass ich nicht auf eine Weise iteriert, die ich einfach nicht finden kann. Ich stelle die Schleife auf Abrundung ein, um Fehler außerhalb der Grenzen zu vermeiden.

+0

Was ist mit den Restwerten zu tun? ('nrow (data) %% 5! = 0') – MichaelChirico

+0

Sie sind nicht notwendig für das, was ich gerade mache.Ich verfolge die Standardabweichung des adj Schlusskurses durch die Geschäftswoche, für die gesamte Lebenszeit einer Aktie – Kristoff

Antwort

1

Keine Notwendigkeit für eine for Schleife.

Wenn der Vektor als x gespeichert ist, könnten Sie tun:

NN <- length(x) 
x <- x[1:(5*floor(length(x)/5))] 
dim(x) <- c(5, length(x)/5) 
apply(x, 2, sd) 

Wenn es in einem data.frame ist, würde ich data.table verwenden (zumal sd ist GForce im current devel version -optimierte):

library(data.table); setDT(data) 
data[ , sd(x), by = .(grp = (0:(length(x) - 1) %/% 5))] 
+0

Gibt es eine Möglichkeit, die erste Lösung, die Sie veröffentlicht haben, mit einer Länge zu arbeiten, die nicht durch 5 teilbar ist, wo ich kann Werfen Sie den Rest, da es nicht signifikant ist. – Kristoff

+0

Die Nummer ändert sich auch jeden Tag, also alle 5 Tage ist sie durch 5 teilbar. Fehler in dim (temp1 [, 6]) <- c (5, Länge (temp1 [, 6])/5): Dims [Produkt 8900] stimmt nicht mit der Länge des Objekts überein [8902] – Kristoff

+0

@Kristoff siehe Edit. Obwohl dies erfordert, eine Kopie zu machen, etwas im Kopf zu behalten. – MichaelChirico

1

Sie können einfach in eine 5-Spalten- (oder Zeilen-) Matrix umwandeln und erhalten die FUN der Zeilen (oder Spalten)

Und da die Matrix so groß ist, können Sie die matrixStats Bibliothek

mm <- read.csv(header = FALSE, text = "2016-04-01,108.779999,110.00,108.199997,109.989998,25626200,109.989998 
2016-03-31,109.720001,109.900002,108.879997,108.989998,25685700,108.989998 
           2016-03-30,108.650002,110.419998,108.599998,109.559998,45159900,109.559998 
           2016-03-29,104.889999,107.790001,104.879997,107.68,30774100,107.68 
           2016-03-28,106.00,106.190002,105.059998,105.190002,19303600,105.190002") 

set.seed(1) 
mm <- mm[, -1] 
mm <- matrix(sample(unlist(mm), 1500 * 55000, TRUE), 1500) 
# num [1:1500, 1:55000] 110 109 110 110 110 ... 

m2 <- matrix(mm, ncol = 5, byrow = TRUE) 
#  [,1]  [,2]  [,3] [,4]  [,5] 
# [1,] 110.42  108.88  109.56 109.56  109.90 
# [2,] 108.99  107.68  105.19 107.68  109.72 
# [3,] 109.90  110.00 25626200.00 108.88 30774100.00 
# [4,] 105.06 25685700.00  105.19 108.88 30774100.00 
# [5,] 107.68  109.90  105.19 104.89  107.79 
# [6,] 108.88  108.78  108.88 108.99  108.20 

system.time({ 
    sds <- apply(m2, 1, sd) 
}) 

# user system elapsed 
## a damn long time 
# Timing stopped at: 114.028 0.81 115.398 

library('matrixStats') 
system.time({ 
    sds <- rowSds(m2) 
}) 

# user system elapsed 
# 0.347 0.051 0.402 

head(sds) 
# [1] 5.620328e-01 1.726982e+00 1.555266e+07 1.556640e+07 2.072692e+00 3.141340e-01 
+0

'rowSds', nett. Beeindruckend. – MichaelChirico

0

ich es Ihnen diese

chunk <- function(y, xs, zs=list()) 
    if (length(xs)<y) zs else chunk(y, xs[-y:-1], c(zs,list(xs[1:y]))) 

Map(sd, chunk(5, data)) 

Dieser Ausgang wird nicht sehr interessant sein, aber zumindest tun könnte verwenden sehen sie arbeiten

Map(sd, chunk(5, 1:18)) 
[[1]] 
[1] 1.581139 

[[2]] 
[1] 1.581139 

[[3]] 
[1] 1.581139 

Diese effektiv tut

list(
    sd(1:5), 
    sd(6:10), 
    sd(11:15) 
) 
# 16:18 is discarded because it does not make a complete chunk 

Dies führt nicht zur Auswahl bestimmter Spalten in Ihrer CSV-Datei. Das musst du selbst machen. Alle abschließenden Elemente, die keinen vollständigen Chunk ergeben, werden verworfen. Schließen Sie Ihre Daten an, um tatsächliche Ergebnisse zu erhalten.

Verwandte Themen