Untermenge eines Datenrahmens in R basierend auf Datumsangaben [geschlossen]

8

Ich habe einen Datensatz mit einer sehr einfachen logdateiähnlichen Struktur. Ich möchte die Daten nach Datumsbereichen unterteilen, kann dies jedoch nur für einen Parameter tun.

Meine Daten sehen so aus:

            date_time loc_id node  energy   kgco2 
1 2009-02-27 00:11:08     87  103 0.00000 0.00000 
2 2009-02-27 01:05:05     87  103 7.00000 3.75900 
3 2009-02-27 02:05:05     87  103 6.40039 3.43701 
4 2009-02-27 03:05:05     87  103 4.79883 2.57697 
5 2009-02-27 04:05:05     87  103 4.10156 2.20254 
6 2009-02-27 05:05:05     87  103 2.59961 1.39599

Die Datei enthält Daten für ein ganzes Jahr. Ich möchte zusammenfassende Diagramme für jeden Monat und vielleicht jede Woche erstellen

Ich verarbeite die date_time wie folgt:

> dt <-as.POSIXlt(ae$date_time)
> ae$dt <- dt
> names(ae$dt)
[1] "sec"   "min"   "hour"  "mday"  "mon"   "year"  "wday"  "yday"  "isdst"

Jetzt versuche ich, die Daten wie folgt zu unterteilen:

> x <- ae$energy[ae$dt$year=="110" & ae$dt$mon=="10"]
> x
numeric(0)

"110" ist wegen folgendem:

> range(ae$dt$year)
[1] 109 110

Ich habe auch folgendes ohne Glück versucht:

> d <- subset(ae, (dt$year=="110" & dt$mon=="10"), select=energy)

diese funktionieren jedoch:

> d <- subset(ae, dt$year=="110", select=energy)

und das auch

> d <- subset(ae, dt$mon=="10", select=energy)

Irgendwelche Ideen, wie ich durch Auswahl von Jahr und Monat Teilmengen erstellen kann?

Vielen Dank,

G Garcia
quelle
2
Ihr Code funktioniert nicht, da die Komponenten eines POSIXlt-Objekts numerisch / ganzzahlig und nicht zeichenweise sind. Aber wie Shane sagte, sollten Sie wirklich eine Zeitreihenklasse verwenden ...
Joshua Ulrich
Ja, wenn Sie bemerken, dass ich die Lösung bereits vor einigen Tagen veröffentlicht habe.
G Garcia

Antworten:

6

ok Zeitreihen scheinen den Trick getan zu haben:

aets <- as.xts(read.zoo("n8_energy_actual2009_2010.csv", header=TRUE, sep=",", FUN=as.POSIXct))
eats.2010 <- aets["2010-01::2010-10"]
G Garcia
quelle
4

Ein paar Punkte:

  1. Ich bin mir nicht sicher, warum das passiert. Offensichtlich sind die POSIXlt-Steckplätze falsch. Ich verwende normalerweise POSIXct, es sei denn, ich muss die Steckplätze unbedingt anpassen.
  2. Eine Möglichkeit besteht darin, die Daten direkt zu verwenden, anstatt mit den Slots herumzuspielen, und zu sagen <=und >=zu unterteilen. Etwas wieae[ae$date >= as.POSIXlt("2009-10-01") & ae$date < as.POSIXlt("2009-11-01"),]
  3. Sie sollten in Betracht ziehen, hierfür eine Zeitreihe zu verwenden, da dies genau der Zweck dieser Datenstruktur ist (und sie viele nützliche Funktionen für den Umgang mit Daten im Zeitverlauf bieten). Eine der häufigsten ist zoo. xtsenthält auch eine Reihe von Funktionen, die bei solchen Dingen helfen können.
Shane
quelle
Danke Shane, ich hatte keine Erfahrung mit der Analyse von Zeitreihen, die ich kurz ausprobiert habe. Dxts = as.xts (as.POSIXct (ae $ date_time)), hatte aber kein Glück, irgendwelche Hinweise?
G Garcia
+1 für die Empfehlung zoo. Es würde Ihre Aufgabe viel einfacher machen. xtsist eher für Paketimplementierer gedacht, obwohl ich es direkt verwendet habe.
Wayne