2013-10-28 37 views
0

有四個時間間隔R:計算中的每個M的時間間隔由N個人花費的時間

[0, 3), [3, 10), [10, 12), and [12, Inf) 

和我們爲之生存時間

10.3, 0.7, 12.2 

我想三個科目來構建一個包含三個行(每個人一個)和四個列(每個時間間隔一個)的矩陣,其中包含每個人在每個時間間隔內花費的時間。

對於這個特殊的例子,我們有

3.0 7 0.3 0.0 
    0.7 0 0.0 0.0 
    3.0 7 2.0 0.2 

你能幫我在R獲得呢?我們的想法是將此對於N大於3


我嘗試大得多:

breaks <- c(0, 3, 10, 12, Inf) # interval break points 
M <- length(breaks) - 1  # number of intervals 
time <- c(10.3, 0.7, 12.2)  # observed survival times 
N <- length(time)    # number of subjects 

timeSpent <- matrix(NA, nrow=N, ncol=M) 
for(m in 1:M) 
{ 
    ind <- which(breaks[m + 1] - time > 0) 
    timeSpent[ind, m] <- time[ind] - breaks[m] 
    timeSpent[-ind, m] <- breaks[m + 1] - breaks[m] 
} 
timeSpent <- replace(x=timeSpent, list=timeSpent < 0, values=0) 

回答

1
breaks <- c(0, 3, 10, 12, Inf) 
time <- c(10.3, 0.7, 12.2) 
timeSpent <- sapply(time, function(x) { 
    int <- max(which(x>breaks)) 
    res <- diff(breaks) 
    res[int:length(res)] <- 0 
    res[int] <- x-breaks[int] 
    res 
           }) 

t(timeSpent) 
#  [,1] [,2] [,3] [,4] 
#[1,] 3.0 7 0.3 0.0 
#[2,] 0.7 0 0.0 0.0 
#[3,] 3.0 7 2.0 0.2 
+0

謝謝你這個不錯的建議(+1)。但是,我的測試表明,隨着N的增長,它會非常緩慢。我會編輯我的帖子,說明我想申請這個N大於3。 – user7064

1

這不循環,應該會更快。但是,潛在的問題可能是內存需求。

tmp <- t(outer(time, breaks, ">")) 
res <- tmp * breaks 
res[is.na(res)] <- 0 
res <- diff(res) 

res[diff(tmp)==-1] <- time+res[diff(tmp)==-1] 
t(res) 
#  [,1] [,2] [,3] [,4] 
#[1,] 3.0 7 0.3 0.0 
#[2,] 0.7 0 0.0 0.0 
#[3,] 3.0 7 2.0 0.2 
相關問題