Ich habe eine for-Schleife innerhalb einer Funktion, und es läuft gut für Datenrahmen, die < 10000 Zeilen haben, aber die für die Schleife verwendete Zeit erhöht exponentiell mit der Anzahl der Zeilen erhöhen. Ich habe gelesen this Post über die Optimierung von Schleifen. Obwohl, ich weiß nicht, wie esWie wird dies für die Schleife in R optimiert?
Hier ist die unten Schleife auf meine Situation anzuwenden:
for (i in 1:nrow(data.frame)) {
event <- as.character(data.frame[i,"Event"])
if(i < 20) {
# do nothing
}
else {
# Get the previous 20 rows
one.sec.interval = data[(i - (20 - 1)):i,]
# print(head(one.sec.interval))
# get the covariance matrix
cov.matrix <- var(one.sec.interval)
# get the variance of the features
variance.of.features <- diag(cov.matrix)
# reformat the variance vector into data frame for easier manipulation
variance.of.features <- matrix(variance.of.features,1,length(variance.of.features))
variance.of.features <- data.frame(variance.of.features)
# rename the variance column of the features
colnames(variance.of.features) <- c('Back.Pelvis.Acc.X.sd', 'Back.Pelvis.Acc.Y.sd', 'Back.Pelvis.Acc.Z.sd',
'Back.Pelvis.Gyro.X.sd', 'Back.Pelvis.Gyro.Y.sd', 'Back.Pelvis.Gyro.Z.sd',
'Back.Trunk.Acc.X.sd', 'Back.Trunk.Acc.Y.sd', 'Back.Trunk.Acc.Z.sd',
'Back.Trunk.Gyro.X.sd', 'Back.Trunk.Gyro.Y.sd', 'Back.Trunk.Gyro.Z.sd')
# create the new feature vector
new.feature.vector <- cbind(data[i,], variance.of.features)
new.feature.vector$Event <- event
one.sec.interval.data[i- (20 - 1),] <- new.feature.vector
}
}
Es wird nicht viel in Bezug auf die Leistung tun, aber für die Lesbarkeit können Sie beginnen, indem Sie die Iterationssequenz in '21: nrow (data.frame)' ändern. Dadurch können Sie die 'if'-Anweisung entfernen (da Ihre Schleife nichts tut, wenn' i <20 'ist). – seasmith
Ich würde auch vorschlagen, Matrizen anstelle von Datenrahmen zu verwenden. Sie sind viel schneller, wenn Sie Teilmengenreihen verwenden. –
Danke, ich werde versuchen, dass – YellowPillow