#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