【问题标题】:grouping time series data by threshold按阈值对时间序列数据进行分组
【发布时间】:2016-07-01 19:32:42
【问题描述】:

我的数据具有所需的范围,但进入了被认为过高或过低的区域。我希望能够将点太高或太低的实例分组为单独的实例。 我在这里做了一些假数据:

library(dplyr)
library(ggplot2)

set.seed(123432)
dat <- data.frame(value = sample(20:600, 20, replace=F))%>%
        mutate(ord = row_number(),
               cat = ifelse(value > 350, "high", 
                     ifelse(value < 90, "low", "good")),
               extreme = ifelse(cat=="high" & value > lag(value) & value > lead(value), "Peak",
                        ifelse(cat=="low" & value < lag(value) & value < lead(value), "Trough", "")))

这里有一张图表:

ggplot(dat, aes(x = ord, y = value))+
  geom_point()+
  geom_line()+
  geom_hline(yintercept = 300, color="blue")+
  geom_hline(yintercept = 120, color="blue")+
  coord_fixed(.025)

我知道如何在 excel 中对这些高低区域进行分组,但似乎无法在 R 中复制它。我想制作这样的东西(尽管 E1 将是“系列”):

注意 E 列基于 C 列,每个系列可能有多个峰/谷。

我希望这很清楚,你们可以提供帮助。如果可能的话,我想坚持使用 dplyr。

谢谢。

【问题讨论】:

  • 我不清楚你真正想要什么。剧情?单独的数据框?单独的数据框列?为我们定义“单独的实例”。
  • 我想在我的数据框中添加一列,看起来像 excel 示例中的列 E。每次“cat”变量发生变化时,它的值都会增加。

标签: r ggplot2 time-series dplyr


【解决方案1】:

根据您在 cmets 中的描述,我认为这就是您要寻找的。请注意,我使用变量 n 参数化了长度:

library(dplyr)
library(ggplot2)

set.seed(123432)
n <- 20
dat <- data.frame(value = sample(20:600, n, replace=F))%>%
  mutate(ord = row_number(),
         cat = ifelse(value > 350, "high", 
                      ifelse(value < 90, "low", "good")),
         extreme = ifelse(cat=="high" & value > lag(value) & 
                                              value > lead(value), "Peak",
                          ifelse(cat=="low" & value < lag(value) & 
                                              value < lead(value), "Trough", "")),
         c1 = cat,
         c2 = c(cat[1],cat[1:(n-1)]),
         chg = cumsum(c2!=c1)+1      )

屈服:

   value ord  cat extreme   c1   c2 chg
1     96   1 good         good good   1
2    254   2 good         good good   1
3    458   3 high    Peak high good   2
4    453   4 high         high high   2
5    567   5 high    Peak high high   2
6    313   6 good         good high   3
7    353   7 high    Peak high good   4
8     20   8  low  Trough  low high   5
9    487   9 high    Peak high  low   6
10    48  10  low  Trough  low high   7
11   288  11 good         good  low   8
12   171  12 good         good good   8
13   175  13 good         good good   8
14   462  14 high    Peak high good   9
15    95  15 good         good high  10
16   360  16 high         high good  11
17   407  17 high         high high  11
18   484  18 high    Peak high high  11
19   159  19 good         good high  12
20    36  20  low    <NA>  low good  13

【讨论】:

  • 就是这样!我将不得不探索更多关于 cumsum(...) 如何工作的信息。这一步可以加入到 dplyr 语句中吗?
  • mutate(dat, chg = cumsum(cat != lag(as.character(cat), default = cat[1])) 感谢您的帮助。你的代码让我上了上面的一个班轮。因为第一个滞后值是NA,所以我使用default参数将NA值填入第一行dat$cat
  • 不错的一个。我尽量坚持使用 base,但我一直不明白为什么 base 没有 lagrotate
猜你喜欢
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
相关资源
最近更新 更多