2016-08-11 10 views
0

Предположим, у меня возникли следующие набор данныхНайти количество дневными интервалами для каждой группы

data 
    Group  Date 
    A  2016-03-10 
    A  2016-03-11 
    A  2016-03-12 
    A  2016-04-13 
    A  2016-04-14 
    A  2016-05-15 
    A  2016-05-16 
    A  2016-05-17 
    B  2016-02-11 
    B  2016-02-12 
    B  2016-02-13 
    B  2016-02-19 
    B  2016-03-15 

Я хочу, чтобы найти различные интервалы дат для каждой группы. Например, для группы А от 2016-03-10 до 2016-03-12 должен быть интервал 1, 2016-04-13 - 2016-04-14 должен быть интервалом 2 и 2016-05-15 до 2016-05-17 должен быть интервал 3. Я хочу найти, где все разрывы и сколько разрывов произошло для каждой группы. Таким образом, я могу проанализировать это. Это должно быть рассчитано для каждой группы. Следующие должны быть мой идеальный выход,

Group  Date   Interval 
A  2016-03-10   1 
A  2016-03-11   1 
A  2016-03-12   1 
A  2016-04-13   2 
A  2016-04-14   2 
A  2016-05-15   3 
A  2016-05-16   3 
A  2016-05-17   3 
B  2016-02-11   1 
B  2016-02-12   1 
B  2016-02-13   1 
B  2016-02-19   2 
B  2016-03-15   3 

Ниже приведены мои tryings,

data %>% group_by(Group) %>% mutate(Date - lag(Date)) . 

Это дает мой вывод НАН Украины на первом ряду, 1 в случае изменения даты и 0, когда оно не изменится. Но я хочу что-то вроде 1,2,3 для каждого интервала дат.

Обновленный набор данных, для которых он не работает,

group  date  count 
(factor) (date) 
1 Albany 2016-02-15 55 
2 Albany 2016-02-16  1 
3 Albany 2016-04-08 40 

ответ

6

Вы можете cumsum от разности вектора, где, когда разница не 1 задается значение, которое должно быть TRUE:

df %>% 
     group_by(Group) %>% 
     mutate(Interval = cumsum(Date - lag(Date, default = first(Date)) != 1)) 

# Source: local data frame [13 x 3] 
# Groups: Group [2] 

# Group  Date Interval 
# <fctr>  <date> <int> 
#1  A 2016-03-10  1 
#2  A 2016-03-11  1 
#3  A 2016-03-12  1 
#4  A 2016-04-13  2 
#5  A 2016-04-14  2 
#6  A 2016-05-15  3 
#7  A 2016-05-16  3 
#8  A 2016-05-17  3 
#9  B 2016-02-11  1 
#10  B 2016-02-12  1 
#11  B 2016-02-13  1 
#12  B 2016-02-19  2 
#13  B 2016-03-15  3 

Данные:

df = structure(list(Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
    Date = structure(c(16870, 16871, 16872, 16904, 16905, 16936, 
    16937, 16938, 16842, 16843, 16844, 16850, 16875), class = "Date")), .Names = c("Group", 
"Date"), row.names = c(NA, -13L), class = "data.frame") 
+0

Я получаю ошибку «Ошибка в View: ожидается одно значение» для команда. Это нормально до даты - запаздывания (дата), но после этого, когда мы даем это значение по умолчанию = сначала (дата), я получаю одно значение. Можете ли вы помочь? – haimen

+0

Не очень уверен. Он работает на примере, который вы дали. Является ли ваш столбец 'Date' класса' Date'? Попробуйте 'lapply (df, class)', чтобы узнать, какой класс у вас есть для каждого столбца. – Psidom

+0

есть. Один фактор, а другой - дата. – haimen

0

Это своего рода дубликат этого вопроса здесь: Group rows in data frame based on time difference between consecutive rows

В основном вы хотите, чтобы сделать эти две операции:

df$gap <- c(0, (diff(df$date) > 1)*1) # identify gap between dates larger than 1 
df$group <- cumsum(df$gap) + 1 # cumulative sum of 'gap' variable 
+0

Я хотел этого в каждой отдельной группе. Это дает его для всего df – haimen

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