如何按时间戳过滤数据集

时间:2016-06-19 16:50:36

标签: r dplyr subset

我正在使用一些鸟类GPS跟踪数据,我想根据时间戳排除点数。

一些背景信息 - GPS记录仪可以跟踪每只鸟只有超过24小时,从晚上开始,持续到夜晚和第二天。我想要做的是排除在部署后的当天晚上9:30之后采取的点数(因此从轨道的最末端删除点数)。 作为一个R新手,我很挣扎,因为每只鸟的部署日期不同,所以我不能简单地使用g-Derived来表示特定的日期和时间。

我的数据帧(df)的一个例子:

subset()

因此,假装这些点代表每只动物的GPS轨迹的开始,我想在6月24日晚上9:30之后移除15K12的鸟,并在6月25日9:30之后移除15K70的鸟。 / p>

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

首先,检查df $ Datetime是否为日期变量:

class(df$Datetime)

如果不是,您可以将其转换为:

df$Datetime <- ymd_hms(df&Datetime)

使用mutate创建一个名为newdate的新变量,该变量获取鸟类数据的最早日期,并设置截止日期,即截止日期为鸟类最早日期的21:30:00 #39;观察结果。

然后,您通过newdate列过滤Datetime列,并获得在指定日期之前找到的观察结果。

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)

这可以解决任何问题。