R найти месяцы подряд - PullRequest
       0

R найти месяцы подряд

0 голосов
/ 18 января 2020

Я бы хотел найти месяц подряд по клиенту. Я думал, что это легко, но все еще не могу найти решения ..

Моя цель - найти месячные покупки для каждого клиента. Любой

Мои данные

Client Month consecutive
A      1       1
A      1       2
A      2       3
A      5       1
A      6       2
A      8       1
B      8       1

Ответы [ 2 ]

1 голос
/ 18 января 2020

Мы можем создать переменную группировки на основе значения diff в соседнем «Месяце» для каждого «Клиента» и использовать его для создания последовательности

library(dplyr)
df1 %>%
  group_by(Client) %>%
  group_by(grp =cumsum(c(TRUE, diff(Month) > 1)), add = TRUE) %>% 
  mutate(consec = row_number()) %>%
  ungroup %>%
  select(-grp)
# A tibble: 7 x 4
#  Client Month consecutive consec
#  <chr>  <int>       <int>  <int>
#1 A          1           1      1
#2 A          1           2      2
#3 A          2           3      3
#4 A          5           1      1
#5 A          6           2      2
#6 A          8           1      1
#7 B          8           1      1

Или используя data.table

library(data.table)
setDT(df1)[, grp := cumsum(c(TRUE, diff(Month) > 1)), Client
       ][, consec := seq_len(.N), .(Client, grp)
        ][, grp := NULL][]

данные

df1 <- structure(list(Client = c("A", "A", "A", "A", "A", "A", "B"), 
    Month = c(1L, 1L, 2L, 5L, 6L, 8L, 8L), consecutive = c(1L, 
    2L, 3L, 1L, 2L, 1L, 1L)), class = "data.frame", row.names = c(NA, 
-7L))
0 голосов
/ 19 января 2020

В базе R мы можем использовать ave

df$consecutive <- with(df, ave(Month, Client, cumsum(c(TRUE, diff(Month) > 1)),
                       FUN = seq_along))
df

#  Client Month consecutive
#1      A     1           1
#2      A     1           2
#3      A     2           3
#4      A     5           1
#5      A     6           2
#6      A     8           1
#7      B     8           1

В dplyr мы можем создать новую группу с lag для сравнения текущего месяца с предыдущим месяцем и назначьте row_number() в каждой группе.

library(dplyr)

df %>%
  group_by(Client,group=cumsum(Month-lag(Month, default = first(Month)) > 1)) %>%
  mutate(consecutive = row_number()) %>%
  ungroup %>%
  select(-group)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...