사건까지 걸린 시간은?
Time to Event
문제
다음은 Facebook에서 본 문제입니다. 그룹 링크. 글은 어떻게 링크를 걸어야 하는가? 어쨋든,
다음의 데이터 프레임 df에서 1은 사건이 일어났음을 의미한다. 0은 사건이 일어나지 않았음을 의미한다. NA는 결측값인가? 어쨋든 0에서 최초로 1이 되기까지 경과 시간을 구해야 한다.
mat = matrix(c(0,0,0,1,1,1,NA,
0,0,0,0,1,NA,NA,
0,0,0,0,NA,NA,NA,
NA,0,1,0,NA,NA,NA,
NA,0,0,0,0,0,0),
nrow=5, ncol=7, byrow=TRUE)
df = data.frame(mat)
colnames(df) = c(as.character(2005:2011))
df
|
2005
<dbl>
|
2006
<dbl>
|
2007
<dbl>
|
2008
<dbl>
|
2009
<dbl>
|
2010
<dbl>
|
2011
<dbl>
|
|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 1 | 1 | NA |
| 0 | 0 | 0 | 0 | 1 | NA | NA |
| 0 | 0 | 0 | 0 | NA | NA | NA |
| NA | 0 | 1 | 0 | NA | NA | NA |
| NA | 0 | 0 | 0 | 0 | 0 | 0 |
해법
- 일단 행렬로 만든다.
NA를 제거한다.cumsum()을 구한다.cumsum()은 0이 지속된다면 계속 0이고, 1로 바뀐 이후부터는 1 이상이 된다. 1이 사건이 일어남, 0이 사건이 일어나지 않음, 그리고 2,3,4는 사건의 횟수를 의미한다면cumsum()을 쓰면 (그때 포함해서) 그때까지 일어난 사건의 횟수를 의미한다고 볼 수 있다.cumsum()결과 0의 횟수를 센다. 즉, 그때까지 일어난 사건의 회수가 1보다 적은 기간을 구한다.
df['time_to_event'] =
apply(as.matrix(df[as.character(2005:2011)]),
1,
function(x) {
sum(cumsum(x[!is.na(x)]) == 0)
})
df
|
2005
<dbl>
|
2006
<dbl>
|
2007
<dbl>
|
2008
<dbl>
|
2009
<dbl>
|
2010
<dbl>
|
2011
<dbl>
|
time_to_event
<int>
|
|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 1 | 1 | NA | 3 |
| 0 | 0 | 0 | 0 | 1 | NA | NA | 4 |
| 0 | 0 | 0 | 0 | NA | NA | NA | 4 |
| NA | 0 | 1 | 0 | NA | NA | NA | 1 |
| NA | 0 | 0 | 0 | 0 | 0 | 0 | 6 |
Leave a comment