我需要根据群组过滤时间序列数据。但是,过滤必须在开始(-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
我想指出这只是样本数据!
感谢您的帮助!
我宁愿根据时间列而不是行数过滤数据,我的原始数据结构不像这样,每组的行数也不同。
答案 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))