2016-03-16 3 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

Я знаю, как группа в первенствует эти высокие & низкие области, но может» t, похоже, повторяет его в R. Я хотел бы произвести что-то вроде этого (хотя E1 будет «Series»):

enter image description here

Столбец уведомления E на основе столбца C & может иметь более одного пика/желоба для каждой серии.

Надеюсь, это было ясно, и вы, люди, можете помочь. Если возможно, я хотел бы придерживаться dplyr.

спасибо.

+1

Это не для меня ясно, что вы на самом деле хотите. Участок? Отдельный кадр данных? Отдельные столбцы фрейма данных? Определите для нас «отдельный экземпляр». –

+0

Я хочу, чтобы столбец был добавлен в мой фрейм данных, который выглядит как столбец E в примере excel. Он должен увеличиваться в стоимости каждый раз, когда происходит изменение в переменной «cat». – 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

'mutate (dat, chg = cumsum (cat! = Lag (as.character (cat), default = cat [1]))' Спасибо за вашу помощь. к первому значению лага. Поскольку первое значение задержки является «NA», я использую аргумент 'default' для заполнения значения NA первой строкой' dat $ cat' – yake84

Смежные вопросы