【问题标题】:R Filtering Time Series data for each groupR过滤每组的时间序列数据
【发布时间】:2016-04-20 07:18:47
【问题描述】:

我需要根据组过滤时间序列数据。但是过滤必须在每组的开始(-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 列向我们展示了组,在这种特殊情况下是 ab

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

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

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

感谢您的帮助!

我宁愿根据时间列而不是行数来过滤数据,我的原始数据不像这个那样结构很好,而且每组的行数各不相同。

【问题讨论】:

  • 您能否进一步解释一下“必须在每个组的开始(-5 分钟)和结束(-2 分钟)进行过滤”是什么意思?
  • 嘿,我刚刚在我的帖子中解释得更好

标签: r


【解决方案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))

【讨论】:

  • 谢谢,dplyr 很有趣。我怎样才能进一步从数据中删除那些选定的行?
  • 我认为@Roman 还没有看到编辑,但您只需将上面lapply 中的3 行代码更改为以下内容:m[(m$Time &gt;= min(m$Time) + (5 * 60)) &amp; ((max(m$Time) - (2 * 60)) &gt;= m$Time), ]
  • 或将dplyr代码中的filter改成如下:filter((Time &gt;= (min(Time) + (5*60))) &amp; (max(Time) - (2*60) &gt;= Time))
  • 可能他没看过,非常感谢。使用dplyr 包,对这些行进行子集化的最有效方法是什么? dpylr 方式看起来好多了,并且可以更快地处理我的数据。 [不再需要]刚刚看到你的帖子*
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 2012-04-09
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多