期間の計算方法について

下記のような契約開始年と契約終了年があった場合、
image

1.契約年
2.無契約年
を算出したいのですが、どのような方法があるのでしょうか?
lag関数を使おうとしたのですが、思うようにできでいません。

1.契約年は、契約end-契約Start+1で計算ができそうなのは分かるのですが、
無契約期間の場合、契約end-契約Start-1となると推測するのですが、どのような計算式と方法をとればよいのか分かりません。
image

知りたいのは、無契約期間の年数と、無契約期間の回数です。
ご教示いただけないでしょうか。

高橋

@Hitoshi_Takahashi さん

最終アウトプットはこんなでしょうか?左から、

id:人のID
start:契約開始
end:契約終了
start_lead:計算用の一時的なカラム
term_start2end:契約期間(開始〜終了)
term_send2start:契約期間(1つ前の終了〜開始)
cnt_no_contarct:その時点で計測できる累計無契約期間の回数
ttl_no_contract:そのIDの無契約期間の回数

15

今は時間がないので、問題ないようでしたら、今日のあいているところで内容返答します!
よろしくお願いします

sugiaki さんお返事、本当にありがとうございます。

無契約期間の年数もアウトプットしたいです。
無契約期間が、「 term_send2start :契約期間(1つ前の終了〜開始)」にあたるか分からないのですが・・。
ID 1 の場合、2012年の契約終了日から2014年の契約開始の間で、1年間の無契約期間があります。
ID 3の場合、2015年の契約終了日から2020年の契約開始の間で、4年間の無契約期間があります。

宜しくお願いいたします。

@Hitoshi_Takahashi さん

貼り付ける画像間違ってました!こっちです。 無契約期間は term_send2startです!

27

やっている内容としては、会員ごとにグループ化して、lead()lag()とは反対方向にずらして行を揃えて引く。

group_by(id) %>%
mutate(
    start_lead = lead(start,1), 
    term_start2end = (end - start)+1, 
    `term_ end2start` = (start_lead - end)-1 , 
    cnt_no_contract = cumsum(if_else(!is.na(start_lead),1,0)), 
    ttl_no_contract = max(cnt_no_contract)
) %>%
  ungroup()

cumsum(if_else(!is.na(start_lead),1,0))は、start_leadに値があれば1を返して、会員ごとに累計することで、無契約期間の回数を計算するということをやっています!

よろしくお願いします!

「いいね!」 1

無契約期間は term_send2startとのこと、了解しました。
お忙しい中、ありがとうございます。

@Hitoshi_Takahashi さん
さっきの返信の下部に、作業内容を記載しておりますので、そちら参考にいただけますと幸いです!
不明点があればお気軽に連絡ください〜!

「いいね!」 1

一気に全部を理解できなかったのですが、
leadを使ってendの次の年をstart_leadのセルに出力させ、start_leadとendの差をterm_ end2startとして計算させているのですね。
出来そうです。
ありがとうございます!

自分の参考のために:https://exploratory.io/note/GMq1Qom5tS/RgD5dzQ3qR?embed=true

「いいね!」 1