2016-06-19 3 views
1

Я работаю с некоторыми данными отслеживания GPS птиц, и я хотел бы исключить точки, основанные на отметке времени.Как отфильтровать набор данных по метке времени

Некоторые справочные данные - регистраторы GPS отслеживают каждую птицу всего за 24 часа, начиная с вечера, и продолжая всю ночь и на следующий день. То, что я хотел бы сделать, - исключить пункты, сделанные после 9:30 вечера в день ПОСЛЕ развертывания (так что удаление точек с самого конца трека). Как новичок R, я борется, потому что даты развертывания различаются для каждой птицы, поэтому я не могу просто использовать subset() для конкретной даты и времени.

Пример моего dataframe (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 

Таким образом, изображая эти точки представляют собой начало GPS дорожки для каждого животного, я хотел бы, чтобы удалить пункты после 9:30 вечера 24 июня для птицы 15K12, а после 9:30 25 июня для птицы 15K70.

Любые идеи?

+0

Может быть чересчур сложным, но 'df%>% group_by (BirdID)%>% filter (Datetime <(Datetime%>% min()%>% as.Date()%>% \' + \ '(1)%>% paste ('21: 30: 00 ')%>% as.POSIXct())) ' – alistaire

ответ

1

Во-первых, проверьте, если ДФ $ Datetime переменная дата:

class(df$Datetime) 

Если это не так, вы можете преобразовать его с этим:

df$Datetime <- ymd_hms(df&Datetime) 

Вы используете мутировать, чтобы создать новую переменную newdate, которая берет самую раннюю дату данных птицы и устанавливает дату отсечения, которая на следующий день в 21:30:00 самой ранней даты наблюдения за птицами.

Затем вы фильтруете столбец Datetime столбцом newdate и получаете ранее обнаруженные наблюдения, указанные в указанной дате.

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

ли воспроизводимый пример:

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) 

Это должно исправить любую проблему.

+0

Я не уверен, что это решает мою проблему, потому что я хочу сохранить очки между 21:30 и 23:59 на отслеживание дня. Например, если отслеживание начинается в 18:00 23 июня, я хочу удалить очки после 21:30 24 июня. – Splash1199

+0

@ Splash1199 Я исправил решение для вашего конкретного запроса :) –

+0

спасибо @toku_mo Первый шаг работал красиво , Однако, когда я пытаюсь фильтровать Datetime Splash1199

Смежные вопросы