私は "広い"データセットに取り組んでいます、そして今私は特定のパッケージを使用したいと思います(-msSurv-
これは区間形式のデータを必要とします。
私の現在のデータセットは、各個人につき1行で特徴付けられます。
dat <- read.table(text = "
id cohort t0 s1 t1 s2 t2 s3 t3
1 2 0 1 50 2 70 4 100
2 1 0 2 15 3 100 0 0
", header=TRUE)
どこで cohort
時間固定共変量であり、 s1
-s3
時変共変量の値に対応 s = 1,2,3,4
時間がかかります(それらは時間の経過とともに個人が訪れた明確な状態です)。カレンダー時間は次のように定義されます。 t1
-t3
、そして範囲 0
に 100
各個人のために。
したがって、たとえば、個人1はカレンダ時間= 50まで状態= 1に留まり、次に時間= 70まで状態= 2に留まり、最後に時間100まで状態= 4に留まります。
私が取得したいのは、 "interval"形式のデータセットです。
id cohort t.start t.stop start.s end.s
1 2 0 50 1 2
1 2 50 70 2 4
1 2 70 100 4 4
2 1 0 15 2 3
2 1 15 100 3 3
例が十分に明確であることを私は願っています、そうでなければ私に知らせてくださいそして私はさらに明確にすることを試みます。
この再構築をどのように自動化しますか?私には、比較的多くの(模擬)個人、およそ100万人がいるとします。
助けてくれてどうもありがとう。
回答:
回答№1は6分かったと思う。これは機能しますか?
require(data.table)
dt <- data.table(dat, key=c("id", "cohort"))
dt.out <- dt[, list(t.start=c(t0,t1,t2), t.stop=c(t1,t2,t3),
start.s=c(s1,s2,s3), end.s=c(s2,s3,s3)),
by = c("id", "cohort")]
# id cohort t.start t.stop start.s end.s
# 1: 1 2 0 50 1 2
# 2: 1 2 50 70 2 4
# 3: 1 2 70 100 4 4
# 4: 2 1 0 15 2 3
# 5: 2 1 15 100 3 0
# 6: 2 1 100 0 0 0
表示された出力が実際に正しいものであり、必要なものであれば、さらに2行で取得できます(おそらく最善の方法ではありませんが、それでも高速であるはずです)。
# remove rows where start.s and end.s are both 0
dt.out <- dt.out[, .SD[start.s > 0 | end.s > 0], by=1:nrow(dt.out)]
# replace end.s values with corresponding start.s values where end.s == 0
# it can be easily done with max(start.s, end.s) because end.s >= start.s ALWAYS
dt.out <- dt.out[, end.s := max(start.s, end.s), by=1:nrow(dt.out)]
dt.out[, nrow:=NULL]
> dt.out
# id cohort t.start t.stop start.s end.s
# 1: 1 2 0 50 1 2
# 2: 1 2 50 70 2 4
# 3: 1 2 70 100 4 4
# 4: 2 1 0 15 2 3
# 5: 2 1 15 100 3 3