2017-01-26 5 views
0

Ich habe einen riesigen Datensatz von 203614 Zeilen und 3 Spalten mit Namen "Preis", "Timestamp", Energie. während Zeitstempel Wiederholungs- für jede TransaktionWie man eine Teilmenge eines Datenrahmens in for Schleife in r nimmt

dataset

Preis ist in numerischer

Zeitstempel hat, ist in posixct

Energie in numerischer

dput(head(dataset)) 

structure(list(Price = c(18, 20, 23, 15, 15, 15), Timestamp.Transaction = structure(c(1388500200, 1388500200, 1388502000, 1388502000, 1388502000, 1388502000), class = c("POSIXct", "POSIXt"), tzone = ""), Energy = c(414, 230, 3, 3, 3, 3)), .Names = c("Price", "Timestamp.Transaction", "Energy"), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame")) 

ich diese folgenden Schritte zu tun haben, durch Anwenden von Schleifen

1) Ich habe den Datensatz mit "Zeitstempeln" Differenz von 1,33 Tagen aus bestimmten Zeitstempeln

2) caluclate die min, max, avg des Preises in Subset und Zuweisen zu neuem Datenrahmen

3) die Teilmenge ich habe oben genannten Schritte für jede 15min Dauer

HINWEIS iterieren: m1 ist mein Dataset

t1 ist der Zeitstempel Vektor wie es Werte i aus der es nur eindeutige Werte

t1 <- unique(timestamp) 
nahm wiederholt

Ich habe dies versucht, aber es wird zu viel Zeit kompilieren und die reults sind falsch

for(i in 125:length(t1)){ for(j in 1:203614){ s1[j,] <- subset(m1,(m1$Timestamp.Transaction <=t1[i] & m1$Timestamp.Transaction >= t1[i]-115200) }} 
+0

Hallo ich habe ein Bild des Datensatzes hinzugefügt. bitte überprüfen Sie es – kris

+0

Struktur (Liste (Preis = c (18, 20, 23, 15, 15, 15), Timestamp.Transaction = Struktur (c (1388500200, 1388500200, 1388502000, 1388502000, 1388502000, 1388502000), Klasse = c ("POSIXct", "POSIXt"), Tzone = ""), Energie = c (414, 230, 3, 3, 3, 3)), .Names = c ("Preis", "Timestamp.Transaction" "Energie"), row.names = c (NA, -6L), Klasse = c ("tbl_df", "tbl", "data.frame")) – kris

+0

Haben Sie meine Lösung versucht? Wenn Sie die Größe Ihrer Daten berücksichtigen, können Sie mit einem vektorisierten Ansatz möglicherweise etwas Zeit sparen. – LAP

Antwort

0

Sie Ihre Untergruppen in einer Liste setzen könnte mit

newdf <- lapply(t1, function(x) 
    subset(dataset, dataset$Timestamp.Transaction <=x & dataset$Timestamp.Transaction >= x-115200)) 

und erhalten dann eine Liste der summary() der Price-Spalten aller Ihrer Untergruppen mit

summaries <- lapply(newdf, function(x) summary(x["Price"])) 

Ausgang:

[[1]] 
    Price  
Min. :18.0 
1st Qu.:18.5 
Median :19.0 
Mean :19.0 
3rd Qu.:19.5 
Max. :20.0 

[[2]] 
    Price  
Min. :15.00 
1st Qu.:15.00 
Median :16.50 
Mean :17.67 
3rd Qu.:19.50 
Max. :23.00 

die Zusammenfassung Einträge zu benennen, verwenden Sie einfach

names(summaries) <- sapply(t1, function(x) paste(x-115200, x, sep = " - ")) 

Neue Ausgabe:

$`2013-12-30 07:30:00 - 2013-12-31 15:30:00` 
    Price  
Min. :18.0 
1st Qu.:18.5 
Median :19.0 
Mean :19.0 
3rd Qu.:19.5 
Max. :20.0 

$`2013-12-30 08:00:00 - 2013-12-31 16:00:00` 
    Price  
Min. :15.00 
1st Qu.:15.00 
Median :16.50 
Mean :17.67 
3rd Qu.:19.50 
Max. :23.00 

Dies sollte viel schneller sein als eine for() -loop verwenden.

+0

danke für deine Hilfe es schneller als mit for-Schleife – kris

0
# You should set timestamps as the vector of all "certain timestamps" and max.time.diff to "1.33 days" 
# I assume there is a subtraction operator for posixct, which produces a number (check it!), if not, use as.double 
# timestamps <- ... 
# max.time.diff <- ... 
len <- length(timestamps) 
mins <- rep(NA, len) 
maxs <- mins 
means <- mins 
for (i in seq(len)) { 
    timestamp <- timestamps[i] 
    prices <- m1$Price[abs(m1$Timestamp - timestamp) <= max.time.diff] 
    mins[i] <- min(prices) 
    maxs[i] <- max(prices) 
    means[i] <- mean(prices) 
} 
+0

hallo, danke für die antwort – kris

+0

ich habe zum teilsatz zum beispiel. mein timestamp ist x und y timestamp muss 1.33days vorbei sein. und es sollte alle 15 Minuten iterieren – kris

+0

@ramakrishnajanga Sie bereits dies geschrieben, und Sie sollten Zeitstempel und max.time.diff entsprechend einstellen. – user31264

Verwandte Themen