R:计算N个个体在M个时间间隔中的每个时间间隔所花费的时间

时间:2013-10-28 12:30:38

标签: r

有四个时间间隔

[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中获得这个吗?我们的想法是将此应用于大于3的N.


我的尝试:

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)

2 个答案:

答案 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

答案 1 :(得分: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