0

有四个时间间隔

[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)
4

2 回答 2

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
于 2013-10-28T13:37:43.817 回答
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
于 2013-10-28T12:49:08.137 回答