R过滤每组的时间序列数据

时间:2016-04-20 07:18:47

标签: r

我需要根据群组过滤时间序列数据。但是,过滤必须在开始(-5分钟)和每组结束(-2分钟)完成,这意味着我想删除每个组的开始(-5分钟)和结束(-2分钟)的行组。

以下是示例代码:

Time <- c("2015-08-21T10:00:51", "2015-08-21T10:02:51", "2015-08-21T10:04:51", "2015-08-21T10:06:51", 
          "2015-08-21T10:08:51", "2015-08-21T10:10:51","2015-08-21T10:12:51", "2015-08-21T10:14:51", 
          "2015-08-21T10:16:51", "2015-08-21T10:18:51", "2015-08-21T10:20:51", "2015-08-21T10:22:51")
x <-  c(38.855, 38.664, 40.386, 40.386, 40.195, 40.386, 40.386, 40.195, 40.386, 38.855, 38.664, 40.386)
y <-  c("a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b")
data <- data.frame(Time,x,y)
data$Time <- as.POSIXct(data$Time, format = "%Y-%m-%dT%H:%M:%S")

Y列向我们显示了这些组,在这种情况下, a b

所以对于这个例子我将删除3个第一行和2个最后一行为a级,对于b同样的事情(在我的原始数据中根据行删除它不是那么容易计数)。所以我最终会得到这样的东西:

                  Time      x y
4  2015-08-21 10:06:51 40.386 a
10 2015-08-21 10:18:51 38.855 b

我想指出这只是样本数据!

感谢您的帮助!

我宁愿根据时间列而不是行数过滤数据,我的原始数据结构不像这样,每组的行数也不同。

1 个答案:

答案 0 :(得分:1)

这个怎么样?拆分data.frame,找到前五分钟和最后两分钟,对行进行逻辑查找并输出结果。

xy <- split(data, data$y)

xy <- lapply(xy, FUN = function(m) {
  m[(m$Time > min(m$Time) + (5 * 60)) & ((max(m$Time) - (2 * 60)) > m$Time), ]
})

do.call("rbind", xy)

                    Time      x y
a    2015-08-21 10:06:51 40.386 a
b    2015-08-21 10:18:51 38.855 b

我知道这些天来提供dplyr解决方案很酷。所以就是这样。

library(dplyr)

data %>%
  group_by(y) %>%
  filter((Time > (min(Time) + (5*60))) & (max(Time) - (2*60) > Time))