2016-06-19 11 views
1

Ich arbeite mit einigen Vogel GPS-Tracking-Daten, und ich möchte Punkte basierend auf dem Zeitstempel ausschließen.Wie man einen Datensatz nach dem Zeitstempel filtert

Einige Hintergrundinformationen - die GPS-Logger verfolgen jeden Vogel für etwas mehr als 24 Stunden, beginnend am Abend und weiter durch die Nacht und den folgenden Tag. Ich möchte Punkte, die nach 21:30 Uhr am Tag NACH dem Einsatz genommen wurden, ausschließen (also Punkte vom Ende der Strecke entfernen). Als R-Neuling habe ich Probleme, da die Einsatzdaten für jeden Vogel unterschiedlich sind. Daher kann ich subset() nicht für ein bestimmtes Datum und eine bestimmte Uhrzeit verwenden.

Ein Beispiel für meinen Datenrahmen (df):

BirdID x    y   Datetime 
15K12  492719.9  5634805  2015-06-23 18:25:00 
15K12  492491.5  5635018  2015-06-23 18:27:00 
15K70  455979.1  5653581  2015-06-24 19:54:00 
15K70  456040.9  5653668  2015-06-24 19:59:00 

So, so zu tun diese Punkte des Start des GPS-Track für jedes Tier darstellen, würde Ich mag Punkte am 24. Juni nach 21.30 Uhr entfernen für Vogel 15K12 und nach 9:30 am 25. Juni für Vogel 15K70.

Irgendwelche Ideen?

+0

Möglicherweise zu pipetastisch, aber 'df%>% group_by (BirdID)%>% filter (DatumZeit <(DateTime%>% min()%>% as.Date()%>% \' + \ '(1)%>% einfügen ('21: 30: 00 ')%>% as.POSIXct())) ' – alistaire

Antwort

1

Zuerst überprüfen, ob df $ für Datum und Uhrzeit eine Datumsvariable ist:

class(df$Datetime) 

Wenn es nicht ist, können Sie es mit dieser konvertieren:

df$Datetime <- ymd_hms(df&Datetime) 

Sie verwenden mutieren eine neue Variable erstellen genannt Neues Datum, das das früheste Datum der Vogeldaten annimmt und das Datum für den Cutoff festlegt, der am nächsten Tag um 21:30 Uhr des frühesten Datums der Vogelbeobachtungen ist.

Dann filtern Sie die Datetime-Spalte nach der Newdate-Spalte und Sie erhalten die Beobachtungen, die früher als das angegebene Datum gefunden wurden.

library(dplyr); library(lubridate) 
df %>% 
    group_by(BirdID) %>% 
    mutate(newdate = as.POSIXct(date(min(Datetime)) + days(1) + hours(21) + minutes(30))) %>% 
    filter(Datetime < newdate) 

Hat ein reproduzierbares Beispiel:

library(dplyr); library(lubridate) 

set.seed(1) 

# Create a data frame (1000 observations) 
BirdID <- paste(rep(floor(runif(250, 1, 20)),4), 
    rep("k", 1000), rep(floor(runif(250, 1, 40)),4), sep = "") 
x <- rnorm(1000, mean = 47000, sd = 2000) 
y <- rnorm(1000, mean = 5650000, sd = 300000) 
Datetime <- as.POSIXct(rnorm(1000, mean = as.numeric(as.POSIXct("2015-06-23 18:25:00")), sd = 99999), tz = "GMT", origin = "1970-01-01") 
df <- data.frame(BirdID, x, y, Datetime, stringsAsFactors = FALSE) 

# Filter the data frame by the specified date 
df_filtered <- df %>% 
    group_by(BirdID) %>% 
    mutate(newdate = as.POSIXct(date(min(Datetime)) + days(1) + hours(21) + minutes(30))) %>% 
    filter(Datetime < newdate) 

Dieses irgendein Problem beheben sollte.

+0

Ich bin mir nicht sicher, dass das mein Problem löst, weil ich Punkte zwischen 21:30 und 23:59 behalten möchte am Tag beginnt die Verfolgung. Zum Beispiel, wenn das Tracking beginnt um 18:00 Uhr am 23. Juni, möchte ich Punkte nach 21:30 am 24. Juni entfernen. – Splash1199

+0

@ Splash1199 Ich reparierte die Lösung für Ihre spezielle Anfrage :) –

+0

danke @toku_mo Der erste Schritt funktionierte schön . Wenn ich jedoch Datetime Splash1199