2016-03-16 62 views
2

我的数据有一个理想的范围,但进入过高或过低的区域。我希望能够将点数过高或过低的实例组合为单独的实例。 我做了一些假的数据在这里:按阈值对时间系列数据进行分组

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) 

enter image description here

我知道如何组在Excel这些高&低的地区,但可以” t似乎复制它在R我想产生这样的东西(虽然E1将是“系列”):

enter image description here

通知列E基于列C &每个系列可能有多个峰值/谷值。

我希望这是明确的,你们乡亲们可以提供帮助。如果可能的话,我想坚持dplyr。

谢谢。

+1

这是我不太清楚你真正想要的东西。剧情?一个单独的数据框?单独的数据框列?为我们定义“独立实例”。 –

+0

我想要一个列添加到我的数据框,看起来像excel示例中的E列。每当“猫”变量发生变化时,它应该增加值。 – yake84

回答

2

从你在评论中的描述我认为这是你在找什么。需要注意的是我的参数长度可变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 
+0

就是这样!我将不得不进一步探讨cumsum(...)的工作原理。这一步可以用于dplyr语句吗? – yake84

+0

是的,我认为是。会做了点:) –

+1

'发生变异(DAT,CHG = cumsum(猫!=滞后(as.character(猫),默认值=猫[1]))' 感谢您的帮助,你的代码让我上面一行。因为第一滞后值是'NA',我用的是'default'参数填写与'$逸cat' – yake84

相关问题