/ /インターバル形式のワイドデータセットの再整形 - r、reshape

区間フォーマットで幅の広いデータセットを再構成する - r、reshape

私は "広い"データセットに取り組んでいます、そして今私は特定のパッケージを使用したいと思います(-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、そして範囲 0100 各個人のために。

したがって、たとえば、個人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