Создайте последовательную переменную, которая сбрасывается в 1 - PullRequest
1 голос
/ 08 октября 2019

У меня есть набор данных, подобный следующему, где «группа» - это переменная группы. Я хочу посчитать количество «следующих» дней по группам, но если это не следующий день, я хочу, чтобы счетчик сбрасывался до одного (как показано в столбце «хочу»). Затем я хочу вернуть максимальный номер столбца «хочу» (как в want2). Буду признателен за предложения!

df<-data.frame(group=c(1, 1, 1, 1, 2, 2, 2), 
               date=c("2000-01-01", "2000-01-03", "2000-01-04", "2000-01-05", "2000-01-09", "2000-01-10", "2000-01-12"),
               want=c(1,1,2,3,1,2,1),
               want2=c(3,3,3,3,2,2,2))

бонус часть 2: Спасибо за все отзывы, это было чрезвычайно полезно. Есть ли способ сделать то же самое с дополнительным условием? У меня есть двоичная переменная, и я также хочу, чтобы мой счетчик сбрасывался, когда эта переменная == 0. Вот так:

#   group       date binary want
#1      1 2000-01-01      1    1
#2      1 2000-01-03      1    1
#3      1 2000-01-04      1    2
#4      1 2000-01-05      0    1
#5      2 2000-01-09      1    1
#6      2 2000-01-10      0    1
#7      2 2000-01-12      1    1
#8      3 2000-01-05      1    1
#9      3 2000-01-06      1    2
#10     3 2000-01-07      1    3
#11     3 2000-01-08      1    4

Я попробовал предложение akrun, которое очень хорошо работало без бинарной переменной, я попытался изменить его, добавив бинарную переменную как часть cumsum, но получаю ошибки:

df %>% group_by(group) 
%>% mutate(wantn = rowid(cumsum(c(TRUE, diff(as.Date(date)) !=1 & binary==1)))

Спасибо!

1 Ответ

1 голос
/ 08 октября 2019

Можно сгруппировать по 'group', затем использовать diff для класса Date, переданного 'date', создать логический вектор и использовать cumsum для репликации результатов в 'want' ('wantn') и затем с помощью 'wantn' примените к нему max

library(dplyr)
library(data.table)
df %>% 
   group_by(group) %>%
   mutate(wantn = rowid(cumsum(c(TRUE, diff(as.Date(date)) !=1))), 
          want2n = max(wantn))
# A tibble: 7 x 6
# Groups:   group [2]
#  group date        want want2 wantn want2n
#  <dbl> <fct>      <dbl> <dbl> <int>  <int>
#1     1 2000-01-01     1     3     1      3
#2     1 2000-01-03     1     3     1      3
#3     1 2000-01-04     2     3     2      3
#4     1 2000-01-05     3     3     3      3
#5     2 2000-01-09     1     2     1      2
#6     2 2000-01-10     2     2     2      2
#7     2 2000-01-12     1     2     1      2

или, если мы не хотим использовать rowid, создайте переменную группировки с помощью cumsum и получите последовательность

df %>%
    group_by(group) %>%
    group_by(group2 = cumsum(c(TRUE, diff(as.Date(date)) !=1)), add = TRUE) %>%
    mutate(wantn = row_number()) %>%
    group_by(group) %>%
    mutate(want2n = max(wantn)) %>%       
    select(-group2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...