2016-04-01 1 views
1

Ich komme gleich zum Punkt: Ich habe einige Datensätze im .csv-Format mit regelmäßig protokollierten Sensordaten von einem Computer gegeben. Dieser Datensatz enthält jedoch auch Messungen, die beim Ausschalten der Maschine vorgenommen wurden und die ich beim Einschalten von den abgemeldeten Daten trennen möchte. Zur Unterteilung der relevanten Daten habe ich auch eine Datei, die die Start- und Endzeiten dieser Abschaltungen enthält. Diese Datei ist mehrere hundert Zeilen lang.Subsetting Daten nach mehreren Zeiträumen - R

Beispiele für die entsprechenden Dateien für dieses Problem:

file: sensor_data.csv 

sens_name,time,measurement 
sens_A,17/12/11 06:45,32.3321 
sens_A,17/12/11 08:01,36.1290 
sens_B,17/12/11 05:32,17.1122 
sens_B,18/12/11 03:43,12.3189 

################################################## 

file: shutdowns.csv 

shutdown_start,shutdown_end 
17/12/11 07:46,17/12/11 08:23 
17/12/11 08:23,17/12/11 09:00 
17/12/11 09:00,17/12/11 13:30 
18/12/11 01:42,18/12/11 07:43 

Um Daten in R Teilmenge, ich habe früher verwendet, um die subset() Funktion mit einfachen Bedingungen, die fein gearbeitet hat, aber ich weiß nicht, wie es weiter gehen über das Subsetting von Sensordaten, die außerhalb von mehreren Shutdown-Datumsbereichen liegen. Ich habe die Datums- und Uhrzeitdaten bereits mit as.POSIXlt() formatiert.

Ich vermute, dass einige Skripts beteiligt sein können, um eine gute Lösung zu finden, aber ich fürchte, ich bin noch nicht erfahren genug, um mit dieser Art von Daten umzugehen.

Jede Hilfe, Beratung oder Lösung wird sehr geschätzt. Lassen Sie mich wissen, ob noch etwas für eine Lösung benötigt wird.

Antwort

1

Ich bevorzuge POSIXct Format für Bereiche in Datenrahmen. Wir erstellen einen Index für Sensoren, die während des Stillstands mit t < shutdown_start OR t > shutdown_end arbeiten. Mit diesen Bereichen können wir dann die Daten nach Bedarf unterteilen:

posixct <- function(x) as.POSIXct(x, format="%d/%m/%y %H:%M") 

sensor_data$time <- posixct(sensor_data$time) 
shutdowns[] <- lapply(shutdowns, posixct) 

ind1 <- sapply(sensor_data$time, function(t) { 
    sum(t < shutdowns[,1] | t > shutdowns[,2]) == length(sensor_data$time)}) 

#Measurements taken when shutdown 
sensor_data[ind1,] 
# sens_name    time measurement 
# 1 sens_A 2011-12-17 06:45:00  32.3321 
# 3 sens_B 2011-12-17 05:32:00  17.1122 

#Measurements taken when not shutdown 
sensor_data[!ind1,] 
# sens_name    time measurement 
# 2 sens_A 2011-12-17 08:01:00  36.1290 
# 4 sens_B 2011-12-18 03:43:00  12.3189 
+0

Vielen Dank, Pierre! Ich habe sogar ein paar Dinge aus deinem Code gelernt. Ich habe jedoch Probleme mit "ind1" nach Abschluss Ihrer Schritte. Die Eingabe von 'summary (ind1)' zeigt, dass jede einzelne Zeile als FALSE bewertet wurde. Ich vermute, dass dies mit der "Filterbedingung" in "function (t)" zusammenhängt, aber ich konnte selbst keine Lösung finden. Gibt es etwas, das ich vermisst habe? Danke nochmal für deine Zeit. – AbuZabi

+0

Hallo nochmal. Ich versuche es immer noch herauszufinden und bin bei dem Versuch, die Rolle der 'sum()' Funktion in 'function (t)' zu verstehen, stecken geblieben. Mit 'sapply()' nimmst du einzelne Messzeiten von 'sensor_data $ time' und bewertest dann, ob jeder die Bedingung in' function (t) 'erfüllt, richtig? Funktioniert die Funktion 'sum()', um zu sehen, ob die sensor_data-Zeiten innerhalb ** irgendeines ** Abschaltintervalls liegen? – AbuZabi

+0

Die Verwendung von 'sum' in der Funktion ist eine Möglichkeit, die Anzahl der TRUEs vs FALSEs zu zählen. Probieren Sie 'sum (c (TRUE, FALSE, TRUE))' aus, um zu sehen, wie es hinzugefügt wird. –