【问题标题】:With the zoo package find maximum of determinated data groups使用 zoo 包找到最大的确定数据组
【发布时间】:2012-06-15 02:16:08
【问题描述】:

我使用 R 才几个月,我遇到了一个动物园系列的问题,每五分钟就有一次数据。该系列中没有缺失的时间点,但数据中有一些 NaN 值。

>str(SerieCompleta)
‘zoo’ series from 2011-01-01 to 2011-12-31 23:55:00
 Data: num [1:104737, 1] 0 0 0 0 0 0 0 0 0 0 ...
- attr(*, "na.action")=Class 'omit'  num [1:383] 2017 3745 5761 6786 6787 ...
 Index:  POSIXct[1:104737], format: "2011-01-01 00:00:00" "2011-01-01 00:05:00" ...

我需要找到数据组的最大值,并且数据组应间隔 30 分钟或更多连续分钟,且值为零。

2011-01-02 05:15:00 0
2011-01-02 05:20:00 0
2011-01-02 05:25:00 0
2011-01-02 05:30:00 0
2011-01-02 05:35:00 0.1 |
2011-01-02 05:40:00 0.2 <--- maximum of group
2011-01-02 05:45:00 0.2 |
2011-01-02 05:50:00 0.1 |
2011-01-02 05:55:00 0.1 |
2011-01-02 06:00:00 0.1 |
2011-01-02 06:05:00 0.1 |
2011-01-02 06:10:00 0   |
2011-01-02 06:15:00 0   |
2011-01-02 06:20:00 0.1 |
2011-01-02 06:25:00 0
2011-01-02 06:30:00 0
2011-01-02 06:35:00 0
2011-01-02 06:40:00 0     thirty or more consecutive minutes with zero values on data
2011-01-02 06:45:00 0
2011-01-02 06:50:00 0
2011-01-02 06:55:00 0
2011-01-02 07:00:00 0.2 |
2011-01-02 07:05:00 2.5 <--- maximum of group
2011-01-02 07:10:00 0 

输出应如下所示:

2011-01-02 05:40:00 0.2
2011-01-02 07:05:00 2.5

我不知道是否有办法使用 R 功能来做到这一点。提前感谢您的任何建议。

【问题讨论】:

  • 您能否阐明保存数据的数据结构?它是一个data.frame吗?如果是这样,有多少列以及这些列的类型(字符、数字等)? (还可以查看 R 中的 strdput 函数,当您想从 R 共享数据时可能会有所帮助)
  • 请解释“数据组应间隔 30 分钟或更长时间,且值为零。”
  • 感谢您的建议:)

标签: r max zoo


【解决方案1】:

我将调用您的数据列xx 仅包括数字数据,不包括日期和时间)。我将进一步假设您没有丢失的时间点,并且您的所有时间点相隔 5 分钟。这是一个函数,它将返回一个两列矩阵,其中每一行包含组的开始和结束索引(它忽略开始和结束的零):

blocks <- function(x) {
    z <- rle(x==0)
    breaks <- which(z$lengths >= 6 & z$values == TRUE)
    breaks <- breaks[!breaks %in% c(1, length(z$lengths))]
    break.idx <- cumsum(z$lengths)
    cbind(c(1, break.idx[breaks] + 1), c(break.idx[breaks-1], length(x)))
}

对于你的数据,你会得到

> x
 [1] 0.0 0.0 0.0 0.0 0.1 0.2 0.2 0.1 0.1 0.1 0.1 0.0 0.0 0.1 0.0 0.0 0.0 0.0 0.0
[20] 0.0 0.0 0.1 2.5 0.0
> blocks(x)
     [,1] [,2]
[1,]    1   14
[2,]   22   24

现在只需对您的组应用 which.max 函数即可获得最大值的索引:

> apply(blocks(x), 1, function(i) {which.max(x[i[1]:i[2]]) + i[1] - 1})
[1]  6 23

【讨论】:

  • 我正在尝试类似的东西。但我正在寻找使用 zoo 或 xts 属性的东西。谢谢:)
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 2020-05-10
  • 2020-07-25
  • 2013-03-17
  • 1970-01-01
  • 2023-02-04
相关资源
最近更新 更多