次のデータがあるとしましょう
user_df = read.table(text = "person_id job_number job_type start_date end_date
1 1 B 2012-11-01 2014-01-01
1 2 A 2016-02-01 2016-10-01
1 3 A 2016-12-01 2020-01-01
1 4 B 2020-01-01 2021-01-01
2 1 A 2011-03-01 2012-08-01
2 2 B 2013-01-01 2020-01-01
2 3 A 2020-01-01 2021-01-01
2 4 B 2021-01-01 2021-01-17
3 1 A 2005-03-01 2011-03-01
3 2 B 2012-01-01 2014-01-01", header = T)
それぞれperson_id
に可変数のジョブがあり、多くのタイプの1つを持つことができます(このデータセットでは、ジョブにはタイプA
またはB
。のみがあります。
switch
現在の行のjob_type
列がA
で、前の列がB
。の場合、1に設定された列を追加したいと思います。それ以外の場合、値は0です。したがって、現在の行がjob_typeであるB
か、現在の行がjob_typeでA
あり、前の行もjob_typeである場合、値はゼロに設定されます。A
最終的なdfは次のようになります。
user_df = read.table(text = "person_id job_number job_type start_date end_date switch
1 1 B 2012-11-01 2014-01-01 0
1 2 A 2016-02-01 2016-10-01 1
1 3 A 2016-12-01 2020-01-01 0
1 4 B 2020-01-01 2021-01-01 0
2 1 A 2011-03-01 2012-08-01 1
2 2 B 2013-01-01 2020-01-01 0
2 3 A 2020-01-01 2021-01-01 1
2 4 B 2021-01-01 2021-01-17 0
3 1 A 2005-03-01 2011-03-01 1
3 2 B 2012-01-01 2014-01-01 0", header = T)
私は解決策が関与しようとしている知っているlag
中でdplyr
、ライブラリが、私は、この目的のためにそれを使用する方法を正確にはわかりません。
考えられるハックの1つjob_type == "A"
は、数値として扱い、diff
関数を適用して変化を測定することです。
tidyverse
バージョン:
library(dplyr)
user_df %>%
group_by(person_id) %>%
mutate(switch = c(0, diff(job_type == "A")),
switch = ifelse(switch == 1, 1, 0))
data.table
バージョン:
library(data.table)
user_dt = data.table(user_df)
user_dt[, switch := c(0, diff(job_type == "A")), by = .(person_id)][
, switch := ifelse(switch == 1, 1, 0)]
user_dt
person_id job_number job_type start_date end_date switch
1: 1 1 B 2012-11-01 2014-01-01 0
2: 1 2 A 2016-02-01 2016-10-01 1
3: 1 3 A 2016-12-01 2020-01-01 0
4: 1 4 B 2020-01-01 2021-01-01 0
5: 2 1 A 2011-03-01 2012-08-01 0
6: 2 2 B 2013-01-01 2020-01-01 0
7: 2 3 A 2020-01-01 2021-01-01 1
8: 2 4 B 2021-01-01 2021-01-17 0
9: 3 1 A 2005-03-01 2011-03-01 0
10: 3 2 B 2012-01-01 2014-01-01 0
どちらのバージョンも明らかに1つのステップで実行できましたが、この方法の方がわかりやすいと思いました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加