Создайте новый столбец на основе суммарных/скользящих значений в столбце группировки

#r #dplyr

#r #dplyr

Вопрос:

Правка: К сожалению, я слишком упростил свои потребности и данные. Я обновлю вопрос ниже.

У меня есть df, аналогичный приведенному ниже коду. Мне нужно создать новый столбец с именем first_funding_date , равным значению fund.date , где sigma==0 , до следующего раза sigma==0 . В примере df ниже first_fund_date должен быть вектор с первым наблюдением, равным «2019/05/22», следующими 3 наблюдениями, равными «2020/09/05», и последними 4, равными «2019/11/30».

  set.seed(111) df lt;- data.frame(id = c(1,1,3,4,5,6,2,7),  fund.date = sample(seq(as.Date('2018/01/01'),  as.Date('2021/01/01'), by="day"), 8),  sigma = c(0,0,1,2,0,1,2,3))  

%gt;% mutate(first_fund_date = ??? )

Мне также нужно создать столбец с именем last_funding_date , равным fund.date , для скользящего максимума сигмы. Первые 4 замечания должны быть «2020/03/03», а последние 4 — «2020/12/04».

Ответ №1:

 library(dplyr) df %gt;%   mutate(first_fund_date = fund.date[sigma==0],  last_funding_date = fund.date[sigma==max(sigma)])  
 id fund.date sigma first_fund_date last_funding_date 1 1 2019-05-22 1 2020-09-05 2018-03-10 2 2 2020-09-05 0 2020-09-05 2018-03-10 3 3 2018-06-24 1 2020-09-05 2018-03-10 4 4 2020-03-03 2 2020-09-05 2018-03-10 5 5 2019-11-30 3 2020-09-05 2018-03-10 6 6 2018-03-10 4 2020-09-05 2018-03-10  

Комментарии:

1. Эй, извини. Мой пример был слишком простым. Я обновил свой вопрос.

Ответ №2:

Ключ здесь в том, чтобы создать переменные индекса group_by с cumsum(sigma==0) помощью и cumsum(sigma lt; lag(sigma)) .

 library(dplyr)  df %gt;%  group_by(index = cumsum(sigma==0))%gt;%  mutate(first_fund.date = first(fund.date))%gt;%  group_by(index_2 = cumsum(sigma lt; lag(sigma, default = Inf)))%gt;%  mutate(last_fund.date = last(fund.date))%gt;%  ungroup()%gt;%  select(-contains('index'))  # A tibble: 8 × 5  id fund.date sigma first_fund.date last_fund.date  lt;dblgt; lt;dategt; lt;dblgt; lt;dategt; lt;dategt;  1 1 2019-05-22 0 2019-05-22 2020-03-03  2 1 2020-09-05 0 2020-09-05 2020-03-03  3 3 2018-06-24 1 2020-09-05 2020-03-03  4 4 2020-03-03 2 2020-09-05 2020-03-03  5 5 2019-11-30 0 2019-11-30 2020-12-04  6 6 2018-03-10 1 2019-11-30 2020-12-04  7 2 2018-11-01 2 2019-11-30 2020-12-04  8 7 2020-12-04 3 2019-11-30 2020-12-04