사건까지 걸린 시간은?
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